使用Python和OpenCV查找图像中的红色

发布于 2021-01-29 18:29:56

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

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

关注者
0
被浏览
182
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我只是将蒙版加在一起,并用它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
    

    这比遍历图像的每个像素要快得多,可读性也要好得多。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看