【问题标题】:Equivalent threshold function of OpenCV in MATLABMATLAB中OpenCV的等效阈值函数
【发布时间】:2014-11-29 00:27:54
【问题描述】:

在 MATLAB 中 cv2.thresholdcv2.inRange 的等价物是什么?

【问题讨论】:

    标签: matlab opencv image-processing


    【解决方案1】:

    让我们一次处理一个函数:

    cv2.threshold

    最接近的等价物是使用im2bw。这会根据您指定的强度级别对图像进行阈值处理。但是,im2bwcv2.threshold 的不同之处在于您无法指定输出阈值。 im2bw 假定它是二进制 1。因此,如果要将其转换为不同的值,则需要将图像转换为 uint8(或图像的任何数据类型),然后设置任何位置是 1 到您希望的任何值。因此,假设您的图像使用imread 加载并且图像被称为imlevel 是您要设置阈值的阈值级别,maxval 是您希望每个阈值像素采用的最终输出值,你会这样做:

    out = im2bw(im, level/255);
    out = uint8(out);
    out(out == 1) = maxval;
    

    请务必注意,阈值水平在[0,1] 之间标准化。我除以 255,因为大多数图像是 uint8,因此除以 255 将得到范围为 [0,1]cv2.threshold 还可以通过 Otsu 进行阈值处理。您可以通过graythresh 在 MATLAB 中执行此操作。 graythresh 将提供[0,1] 之间的最佳阈值,您可以直接输入到im2bw 中。因此:

    out = im2bw(im, graythresh(im));
    out = uint8(out);
    out(out == 1) = maxval;
    

    cv2.inRange

    MATLAB 本身不支持此功能。您需要做的是获取图像的每个平面(只有一个用于灰度,三个用于彩色),并单独检查是否有像素在有效范围内。如果有,您可以将其设置为逻辑true。因此,对于灰度图像,您可以执行以下操作:

    minval = ...; %// Define minimum value here
    maxval = ...; %// Define maximum value here
    
    out = (im >= minval & im <= maxval);
    

    对于彩色图像,您可以执行以下操作:

    minval = ...; %// Define three element vector here for each colour plane i.e. [0 128 128];
    maxval = ...; %// Define three element vector here for each colour plane i.e. [0 128 128];
    
    out = true(size(im,1), size(im,2));
    for p = 1 : 3
        out = out & (im(:,:,p) >= minval(p) & im(:,:,p) <= maxval(p));
    end
    

    我们在这里做的是逐个平面检查每个颜色平面是否在minvalmaxval 中每个元素指定的范围内。一旦我们发现一个像素超出任何颜色平面的范围,我们就会将此位置设置为false


    祝你好运!

    【讨论】:

    • 是的!这是答案很好解释。我还认为没有等效的 MATLAB 函数。必须修改这些,或者必须使用索引。非常感谢您的回答!
    • @Maham - 不客气 :) 这个问题集 Python、OpenCV 和 MATLAB 于一体。我忍不住回答!
    • @Maham - 我的帖子中有一些小错别字。请检查我的编辑。
    猜你喜欢
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 2014-03-30
    • 1970-01-01
    相关资源
    最近更新 更多