使用Python和OpenCV查找图像中的红色
我正在尝试从图像中提取红色。我有应用阈值的代码,仅保留指定范围内的值:
img=cv2.imread('img.bmp')
img_hsv=cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_red = np.array([0,50,50]) #example value
upper_red = np.array([10,255,255]) #example value
mask = cv2.inRange(img_hsv, lower_red, upper_red)
img_result = cv2.bitwise_and(img, img, mask=mask)
但是,正如我检查的那样,红色的色相值可以在0到10的范围内,也可以在170到180的范围内。因此,我想保留这两个范围中任何一个的色相值。我尝试将阈值从10设置为170并使用cv2.bitwise_not()
函数,但随后我也获得了所有白色。我认为最好的选择是为每个范围创建一个遮罩并同时使用它们,因此我必须以某种方式将它们合并在一起,然后再继续。
有没有办法我可以使用OpenCV连接两个蒙版?还是有其他方法可以实现我的目标?
编辑。我带来的不是很多优雅但可行的解决方案:
image_result = np.zeros((image_height,image_width,3),np.uint8)
for i in range(image_height): #those are set elsewhere
for j in range(image_width): #those are set elsewhere
if img_hsv[i][j][1]>=50 \
and img_hsv[i][j][2]>=50 \
and (img_hsv[i][j][0] <= 10 or img_hsv[i][j][0]>=170):
image_result[i][j]=img_hsv[i][j]
它几乎可以满足我的需求,并且OpenCV的功能可能几乎相同,但是如果有更好的方法(使用一些专用功能并编写更少的代码),请与我分享。:)
-
我只是将蒙版加在一起,并用它
np.where
来蒙版原始图像。img=cv2.imread("img.bmp") img_hsv=cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # lower mask (0-10) lower_red = np.array([0,50,50]) upper_red = np.array([10,255,255]) mask0 = cv2.inRange(img_hsv, lower_red, upper_red) # upper mask (170-180) lower_red = np.array([170,50,50]) upper_red = np.array([180,255,255]) mask1 = cv2.inRange(img_hsv, lower_red, upper_red) # join my masks mask = mask0+mask1 # set my output img to zero everywhere except my mask output_img = img.copy() output_img[np.where(mask==0)] = 0 # or your HSV image, which I *believe* is what you want output_hsv = img_hsv.copy() output_hsv[np.where(mask==0)] = 0
这比遍历图像的每个像素要快得多,可读性也要好得多。