假设我有一个numpy数组图像,该图像已被二值化:所有值都是0或255。在opencv的python变体中,我可以这样做:
conn = cv2.connectedComponentsWithStats(mask, 8, cv2.CV_32S)
而conn物体会告诉我:
此外,可以保证标签0是“背景”标签,但是根据文档,没有任何迹象表明该背景是如何确定的。
假设我的图像是白色背景上的黑点,实际上无法保证行为:可能是一个实际上使背景溢出的黑点(留下“背景角”)或多个小块点,甚至是黑点以这种方式排列在它们之间创建白色小岛,等等。
但是我只对我的黑点感兴趣。
当我不相信openCV提供的背景组件的颜色时,是否有一种简单的Python方式来确定每个连接段的基础颜色?或者:我是否缺少关于connectedComponent功能或OpenCV API的明显信息?
(请注意:我知道我可以这样做:遍历标签,在提供的标签数组中找到每个标签的第一个实例,然后探查图像数组中的相应索引。至少我认为我可以做到-文档很少。但这使我感到非常不雅。)
正如一个有趣的点,ImageMagick 中的连接组件确实列出了该区域的平均颜色,因为它允许模糊颜色区域确定(根据模糊值),此处未显示。
这是一个简单的二进制示例,因此平均颜色是实际颜色:
magick objects.gif -define connected-components:verbose=true -connected-components 4 -auto-level regions.png
Objects (id: bounding-box centroid area mean-color):
  0: 256x171+0+0 119.2,80.8 33117 srgb(0,0,0)
  2: 120x135+104+18 159.5,106.5 8690 srgb(255,255,255)
  3: 50x36+129+44 154.2,63.4 1529 srgb(0,0,0)
  4: 21x23+0+45 8.8,55.9 409 srgb(255,255,255)
  1: 4x10+252+0 253.9,4.1 31 srgb(255,255,255)
列表首先按最高区域排序。因此,“背景”将由最大的区域面积确定并列在第一位。
结果通过 id 编号编码为灰度级,通过 -auto-level 拉伸到全动态范围以供查看。
还有一个定义参数,可以设置它来生成按区域过滤的输出,然后按平均颜色显示包含结果区域的图像。
magick objects.gif -define connected-components:area-threshold=410 -define connected-components:mean-color=true -connected-components 4 filtered.png