我想使用OpenCV检测一个对象,它与场景中的其他元素明显不同,因为它是灰色的.这很好,因为我可以用R == G == B进行测试,并且它允许独立于亮度,但是逐像素地进行测试很慢.
有没有更快的方法来检测灰色的东西?也许有一个OpenCV方法可以进行R == G == B测试... cv2.inRange
颜色阈值处理,它不是我想要的.
我在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倍.
在此测试映像上运行此操作:
给出以下结果:
如您所见,正确检测到灰色对象.
归档时间: |
|
查看次数: |
2002 次 |
最近记录: |