如何通过opencv获取连接组件中的所有像素?

Posted

技术标签:

【中文标题】如何通过opencv获取连接组件中的所有像素?【英文标题】:How to get all pixels in connected components by opencv? 【发布时间】:2016-06-11 07:42:07 【问题描述】:

我使用新的opencv 函数connectedComponentsWithStats(3.0 版)。 如何获取连通分量中的所有像素?

结果

【问题讨论】:

快速浏览一下文档,看起来您正在打印第三个参数stats。根据文档,我希望像素位于第二个参数label 中。我想象一个没有标签的黑色像素(零)的图像,然后为 3 个组件中的每一个组件用 3 种颜色修补像素。使用统计数据,如果它可以帮助您进行可视化,您可以绘制一个边界框。 谢谢,我终于成功了..谢谢你的建议。 【参考方案1】:

connectedComponentsWithStats 的第三个参数stats 提供的信息可让您在标记区域周围绘制边界框。

第二个参数labels 应该包含一个图像,其中未标记像素的零(黑色像素)和标记的像素组的彩色像素,每个标签一种颜色。请记住,非零值将是唯一的,但非常小(例如,对于 7 个标签,从 0(背景)开始,标签值将上升到 6)。

这是一个 9x9 二进制图像示例:

[
    [255,255,  0,  0,  0,  0,  0,255,255],
    [255,  0,  0,255,255,255,  0,  0,255],
    [  0,  0,255,  0,  0,  0,255,  0,  0],
    [  0,255,  0,  0,255,  0,  0,255,  0],
    [  0,255,  0,255,255,255,  0,255,  0],
    [  0,255,  0,  0,255,  0,  0,255,  0],
    [  0,  0,255,  0,  0,  0,255,  0,  0],
    [255,  0,  0,255,255,255,  0,  0,255],
    [255,255,  0,  0,  0,  0,  0,255,255]
]

连接的组件标签是:

[
 [1 1 0 0 0 0 0 3 3]
 [1 0 0 2 2 2 0 0 3]
 [0 0 2 0 0 0 2 0 0]
 [0 2 0 0 4 0 0 2 0]
 [0 2 0 4 4 4 0 2 0]
 [0 2 0 0 4 0 0 2 0]
 [0 0 2 0 0 0 2 0 0]
 [5 0 0 2 2 2 0 0 6]
 [5 5 0 0 0 0 0 6 6]
]

要通过imshow 可视化它们,您可能需要放大这些值。 (可以是您选择的颜色的查找表或计算颜色,只要它们的差异足以在视觉上有意义)。

这是一个将上面的标签缩放 42(最大值 255 / 6 个前景标签)的示例:

[
 [ 42  42   0   0   0   0   0 126 126]
 [ 42   0   0  84  84  84   0   0 126]
 [  0   0  84   0   0   0  84   0   0]
 [  0  84   0   0 168   0   0  84   0]
 [  0  84   0 168 168 168   0  84   0]
 [  0  84   0   0 168   0   0  84   0]
 [  0   0  84   0   0   0  84   0   0]
 [210   0   0  84  84  84   0   0 252]
 [210 210   0   0   0   0   0 252 252]
]

【讨论】:

以上是关于如何通过opencv获取连接组件中的所有像素?的主要内容,如果未能解决你的问题,请参考以下文章

opencv如何读取多边形区域内的像素值?

OpenCV - 从图像中获取灰度值

如何从 OpenCV Python 中的特征匹配中获取像素坐标

用opencv如何提取像素点的RGB分量

如何使用opencv获取已经灰度化二值化的一张黑色图片中的一个亮点的具体像素坐标

opencv如何计算图像中物体的像素值