我有这张图片:
我正在尝试用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任何帮助表示赞赏。谢谢。
最佳答案
问题是您没有阅读documentation of inRange:D
这说明了以下几点:
然后检查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。
在我看来,您选择的蓝色范围离紫罗兰色的边有点远...您可以使用像这样的hsv colorpicker http://colorizer.org/并选择所需的范围。只是记住OpenCV使用H-> Hue / 2,而S和V就像百分比(0-100),只需将它们除以100(0-1。),再乘以255。
关于python - 检查图像是否包含蓝色像素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51324202/