MATLAB中cv2.threshold
和cv2.inRange
的等价物是什么?
答案 0 :(得分:1)
让我们一次解决一个问题:
cv2.threshold
最接近的等价物是使用im2bw
。这会根据您指定的强度级别对图像进行阈值处理。但是,im2bw
与cv2.threshold
相比有什么不同之处在于不能指定输出阈值的值。 im2bw
假定它是二进制1.因此,如果要将其转换为不同的值,则需要将图像转换为uint8
(或者图像的任何数据类型) ,然后将任何1的位置设置为您希望的任何值。因此,假设您的图片已加载imread
且图片名为im
,level
是您想要达到阈值的阈值级别,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
我们在这里做的是逐行飞行并检查每个颜色平面是否在minval
和maxval
中每个元素指定的范围内。一旦我们找到一个超出任何颜色平面范围的像素,我们就会将此位置设置为false
。