[英]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.