使用OpenCV检测灰色内容

Sol*_*oid 5 python opencv

我想使用OpenCV检测一个对象,它与场景中的其他元素明显不同,因为它是灰色的.这很好,因为我可以用R == G == B进行测试,并且它允许独立于亮度,但是逐像素地进行测试很慢.

有没有更快的方法来检测灰色的东西?也许有一个OpenCV方法可以进行R == G == B测试... cv2.inRange颜色阈值处理,它不是我想要的.

Aur*_*ius 9

我在Python中可以找到的最快的方法是使用切片来比较每个通道.经过几次测试后,此方法比两个嵌套的for循环快200倍.

bg = im[:,:,0] == im[:,:,1] # B == G
gr = im[:,:,1] == im[:,:,2] # G == R
slices = np.bitwise_and(bg, gr, dtype= np.uint8) * 255
Run Code Online (Sandbox Code Playgroud)

这将生成二进制图像,其中灰色对象由白色像素指示.如果您不需要二进制图像,但只需要一个逻辑数组,其中灰色像素由True值指示,则此方法会更快:

slices = np.bitwise_and(bg, gr)
Run Code Online (Sandbox Code Playgroud)

省略类型转换和乘法产生的方法比嵌套循环快500倍.

在此测试映像上运行此操作:

图像与灰色物体

给出以下结果:

灰色物体检测面罩

如您所见,正确检测到灰色对象.