如何在openCV中对连接的组件进行分割?

Posted

技术标签:

【中文标题】如何在openCV中对连接的组件进行分割?【英文标题】:How to do segmentation of connected components in openCV? 【发布时间】:2017-06-06 15:29:45 【问题描述】:

我必须分割this Image 中的每个单独元素。我已将原始图像转换为阈值二值图像,然后应用了一些形态膨胀。然后我应用 cv::connectedComponents 函数来标记每个连接的组件。现在我想裁剪它们,如何使用 c++ 和 openCV 来实现?

【问题讨论】:

他们已经应该有一个标签......所以你可以循环像素并获取数字,然后将具有所需标签的那些复制到另一个图像。您也可以使用您在此示例中创建的掩码进行复制,例如 copyImage.setTo(cv::Scalar(255,255,255), labelImage == 4) 在此示例中 4 是所需的标签 【参考方案1】:

如果不使用 connectedComponents 而是使用 connectedComponentsWithStats,您应该有足够的信息来裁剪每个标记的对象。

【讨论】:

谢谢@TFreitas !!考虑到我是 openCV 的新手,您能否更详细地解释一下如何裁剪各个元素?我打印了函数返回的连接组件的数量,即 559,现在我想将它们分开吗?怎么做 ?请帮我解决这个问题。 wil connectedComponentsWithStats 您将拥有一个带有每个对象统计信息的 Mat: cv::Mat labels, stats, centroids; int numberofObjects = cv::connectedComponentsWithStats(图像,标签,统计,质心,8,CV_16U);如果您在文档中看到,您会看到这些统计信息具有每个对象边界框的长度和高度。要削减它们,只需将属性访问为: for (int label = 1; label (label, CC_STAT_HEIGHT);高度 = stats.at(标签,CC_STAT_WIDTH);使用此信息来削减每个对象的 ROI 太好了,很高兴为您提供帮助!

以上是关于如何在openCV中对连接的组件进行分割?的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中使用openCV的连接组件和统计信息?

如何在 Swift 中对字符串进行切片? [复制]

如何使用 OpenCV 将细线提取为单独的轮廓/连接组件?

如何避免在反应功能组件中对“静态组件”进行不必要的重新渲染?

在opencv python中对图像进行倾斜检测的代码

如何在 AngularJS2“final”中对组件进行单元测试?