繁体   English   中英

python中HSV图像的阈值限制

[英]thersholding limits on HSV image in python

我已读取图像并将图像转换为HSV图像。 我想分别为色相,饱和度和值分量应用阈值限制。 色相阈值0到1,饱和度阈值0.28到1,值阈值0到0.55

我要将此应用程序用于颜色遮罩!

如何在我的图像文件上应用这些限制。

image_read = cv2.imread('tryimage.jpg')
im = cv2.cvtColor(image_read,cv2.COLOR_RGB2HSV)
im_hue = im[:,:,0]
im_sat = im[:,:,1]
im_val = im[:,:,2]
# how to apply thershold ?
fig, ax  = plt.subplots(nrows=1,ncols=3)
ax[0].imshow(im_hue)
ax[1].imshow(im_sat)
ax[2].imshow(im_val)
plt.show()

我在Matlab中也做过同样的事情,只提取了每个波段中我感兴趣的像素,然后将它们合并回去以获得我感兴趣的像素。 这是我的matlab代码段,我想在python中做同样的事情。

color.hueThresholdLow         = 0;
color.hueThresholdHigh        = 1;
color.saturationThresholdLow  = 0;
color.saturationThresholdHigh = 0.28;
color.valueThresholdLow       = 0.38;    
color.valueThresholdHigh      = 0.97;
maskedRGBImage  = color_masking(rgbImage,color);

function color_masking(rgbImage, color)
hsvimage = rgb2hsv(rgbImage);
himage = hsvimage(:,:,1);
simage = hsvimage(:,:2);
vimage = hsvimage(:,:,3);
hMask = (hImage >= color.hueThresholdLow) & (hImage <= color.hueThresholdHigh);
sMask = (sImage >= color.saturationThresholdLow) & (sImage <= color.saturationThresholdHigh);
vMask = (vImage >= color.valueThresholdLow) & (vImage <= color.valueThresholdHigh); 

ObjectsMask = uint8(hMask & sMask & vMask);
.....

在python中,您可以编写与Matlab非常相似的代码。 通常,为可能多次使用的方法创建函数是一个好主意,但是如果不符合您的需要,可以随时删除函数声明。

def threshold_hsv(im_hsv, hlow, hhigh, slow, shigh, vlow, vhigh):
    im_hue = im_hsv[:,:,0]
    im_sat = im_hsv[:,:,1]
    im_val = im_hsv[:,:,2]

    h_mask = (im_hue >= hlow) & (im_hue <= hhigh)
    s_mask = (im_sat >= slow) & (im_sat <= shigh)
    v_mask = (im_val >= vlow) & (im_val <= vhigh)

    return h_mask & s_mask & v_mask

然后您可以使用以下数据调用该函数:

>>> object_mask = threshold_hsv(hsvimage, 0, 1, 0, 0.28, 0.38, 0.97)

如您所见,其语法与matlab的语法非常相似(如果不相同)。 只要您的hsvimage是一个numpy数组 ,这就是OpenCV在python中生成的数组

选择满足您的限制的值(并丢弃那些不在限制范围内的值),请使用列表推导

# filtered_pixels is a list of tuples, which are ordered as (h, s, v)
# i.e. filtered_pixels[0][0] = h, filtered_pixels[0][1] = s and
# filtered_pixels[0][2] = v
filtered_pixels = [(im_hue[i], im_sat[i], im_val[i]) for i in range(len(im_hue)) if satisfies_limits(im_hue[i], im_sat[i], im_val[i])] 

satisfies_limits是用于检查传递的色相,饱和度和值是否在所需限制内的函数。 您可以根据需要将上面的列表理解解开for循环。


要将所有值限制为给定的限制,请使用内置的map()

clamped_hue = map(lambda h: max(hue_min, min(h, hue_max)), im_hue)
# And so on for saturation and value

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM