【问题标题】:Find the color of connectedComponents in Python OpenCV在 Python OpenCV 中查找 connectedComponents 的颜色
【发布时间】:2019-08-14 22:24:59
【问题描述】:

假设我有一个已二值化的 numpy 数组图像:所有值都是 0 或 255。在 opencv 的 python 变体中,我可以这样做:

conn = cv2.connectedComponentsWithStats(mask, 8, cv2.CV_32S)

conn 对象会告诉我:

  • 有多少连通分量(标签)
  • 原图中每个像素的标签
  • 每个连接组件的边界框和区域
  • 每个连接组件的质心位置

此外,可以保证标签 0 是“背景”标签,但根据 documentation,没有说明如何确定该背景。

假设我的图像是白色背景上的黑点,实际上无法保证行为:可能是一个实际上溢出背景的黑点(留下“背景角”)或多个小块点,甚至是排列成这样的黑点一种在它们之间创建白色岛屿的方式,等等。

但我只对我的黑点感兴趣。

当我不相信 openCV 提供的背景组件的颜色时,是否有一种简单的 Pythonic 方式来确定每个连接段的基础颜色?或者:我是否遗漏了有关 connectedComponent 功能或 OpenCV API 的一些明显内容?

(注意:我知道我可以强制执行此操作:循环遍历标签,在提供的标签数组中找到每个标签的第一个实例,然后探测图像数组中的相应索引。至少我认为我可以做到那——文档很少。但这让我觉得非常不雅。)

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    正如一个兴趣点,connected components in 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
    


    【讨论】:

      【解决方案2】:

      对于每个连接的组件,您可以制作一个掩码并使用此函数计算平均值: cv2.mean(image, mask)

      conn = cv2.connectedComponentsWithStats(input_binary, 8, cv2.CV_32S)
      num_labels = conn[0]
      labels = conn[1]
      stats = conn[2]
      centroids = conn[3]
      
      for l in labels:
          mask = np.array(labels, dtype=np.uint8)
          mask[labels==l] = 255 
      
          mean_label = cv2.mean(input_binary, mask)
          print(mean_label)
      

      【讨论】:

        猜你喜欢
        • 2021-01-03
        • 2017-02-04
        • 2019-01-07
        • 1970-01-01
        • 2022-08-12
        • 2018-09-08
        • 2016-05-28
        • 2017-11-19
        • 2018-10-21
        相关资源
        最近更新 更多