使用Python&在图像中查找红色OpenCV的 [英] Finding red color in image using Python & OpenCV

查看:733
本文介绍了使用Python&在图像中查找红色OpenCV的的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从图像中提取红色.我有应用阈值的代码,仅保留指定范围内的值:

I am trying to extract red color from an image. I have code that applies threshold to leave only values from specified range:

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()函数,但是随后我也获得了所有白色.我认为最好的选择是为每个范围创建一个遮罩并同时使用它们,因此我必须以某种方式将它们合并在一起,然后再继续.

But, as i checked, red can have Hue value in range, let's say from 0 to 10, as well as in range from 170 to 180. Therefore, i would like to leave values from any of those two ranges. I tried setting threshold from 10 to 170 and using cv2.bitwise_not() function, but then i get all the white color as well. I think the best option would be to create a mask for each range and use them both, so I somehow have to join them together before proceeding.

有没有一种方法可以使用OpenCV连接两个蒙版?还是有其他方法可以实现我的目标?

Is there a way I could join two masks using OpenCV? Or is there some other way I could achieve my goal?

编辑.我带来的不是很多优雅但可行的解决方案:

Edit. I came with not much elegant, but working solution:

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的功能可能几乎相同,但是如果有更好的方法(使用一些专用功能并编写更少的代码),请与我分享. :)

It pretty much satisfies my needs, and OpenCV's functions probably do pretty much the same, but if there's a better way to do that(using some dedicated function and writing less code) please share it with me. :)

推荐答案

我只是将蒙版加在一起,然后使用np.where蒙版原始图像.

I would just add the masks together, and use np.where to mask the original image.

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

与遍历图像的每个像素相比,这应该更快,更易读.

This should be much faster and much more readable than looping through each pixel of your image.

这篇关于使用Python&amp;在图像中查找红色OpenCV的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆