对python中HSV图像的限制

时间:2016-06-10 08:35:52

标签: python

我已经阅读了图像,并且已将图像转换为HSV图像。 我想分别对色调,饱和度和值组件应用阈值限制。 Hue thershold 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);
.....

2 个答案:

答案 0 :(得分:1)

在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的语法非常相似(如果不相同)。只要您的hsvimagenumpy array,这就是OpenCV在python中生成的内容。

答案 1 :(得分:0)

选择满足限制的值(并丢弃不在限制范围内的值),请使用list comprehensions

# 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