我已经阅读了图像,并且已将图像转换为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);
.....
答案 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的语法非常相似(如果不相同)。只要您的hsvimage
是numpy 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