我有这张图片:
我正在尝试用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_l
和hsv_h
定义的范围不好?我从这里拿走的:OpenCV & Python -- Can't detect blue objects
感谢您的帮助。谢谢。
答案 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。