检查图像是否包含蓝色像素

时间:2018-07-13 11:34:55

标签: python opencv

我有这张图片:

enter image description here

我正在尝试用Python编写一个函数,如果图像包含蓝色像素,则该函数将返回True,否则返回False。 该图像只是一个例子。我会有其他人使用的蓝色可能会略有不同。但是它们始终是黑色背景上的蓝色字母。

到目前为止,我有这个:

def contains_blue(img):
    # Convert the image to HSV colour space
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    # Define a range for blue color
    hsv_l = np.array([100, 150, 0])
    hsv_h = np.array([140, 255, 255])
    # Find blue pixels in the image
    #
    # cv2.inRange will create a mask (binary array) where the 1 values
    # are blue pixels and 0 values are any other colour out of the blue
    # range defined by hsv_l and hsv_h
    return 1 in cv2.inRange(hsv, hsv_l, hsv_h)

该函数始终返回False,因为在1返回的数组中找不到cv2.inRange的值。也许hsv_lhsv_h定义的范围不好?我从这里拿走的:OpenCV & Python -- Can't detect blue objects

感谢您的帮助。谢谢。

2 个答案:

答案 0 :(得分:2)

您本可以使用np.any()来代替。如果任何一个像素的值为255,它将返回True

所以不是

return 1 in cv2.inRange(hsv, hsv_l, hsv_h)

您可以添加以下内容:

return np.any(cv2.inRange(hsv, hsv_l, hsv_h))

更新

如评论中提到的@AKX一样,您可以尝试以下方法:

return cv2.inRange(hsv, hsv_l, hsv_h).any()

答案 1 :(得分:1)

问题是您没有阅读documentation of inRange:D

其中有以下内容:

  

也就是说,如果src(I)位于dst(I)的范围内,则dst(I)设置为255(全1位)。   指定1D,2D,3D,...框,否则指定0。

然后您检查1

# cv2.inRange will create a mask (binary array) where the 1 values
# are blue pixels and 0 values are any other colour out of the blue
# range defined by hsv_l and hsv_h
return 1 in cv2.inRange(hsv, hsv_l, hsv_h)

因此解决方案是将其更改为:

return 255 in cv2.inRange(hsv, hsv_l, hsv_h)

我用您的图像对其进行了测试,并返回true,还对黑白图像(虽然是BGR)返回了false。

在我看来,您选择的蓝色范围与紫罗兰色的距离有点远...您可以使用类似http://colorizer.org/的hsv彩色选择器,然后选择所需的范围。只是记住OpenCV使用H-> Hue / 2,而S和V就像百分比(0-100),只需将它们除以100(0-1。),再乘以255。