实际上,我想要以下二进制图像上的“白色”像素的五个外部边界框。所需区域以红色突出显示。
要获得第 5 个边界框,我会扩大或模糊它。但是,膨胀会将区域 3 与区域 1 和 2 合并,所以我会得到一个几乎覆盖整个图像的边界框。 (如果我不扩大或模糊它,那么 cv::findContours
+ cv::boundingRect
将产生大量的小矩形。)
换句话说,我只想要“足够大”的边界框。
这只是一个示例模式。区域的位置可能会有所不同。有没有办法以一般方式解决问题?
最佳答案
膨胀是在每个像素的基础上完成的,而不考虑像素所属组件的大小。
如果您只想对小 Blob 应用膨胀,那么您需要在应用膨胀之前移除大 Blob 。
因此,使用 findContours 提取所有轮廓,然后将所有“足够大”的轮廓存储在一个列表中,并在源图像中将它们涂成黑色。然后扩大修改后的源并提取剩余的轮廓。
请注意,要获得正确的边界框大小,您可能想要的是 morphological closing (膨胀之后是相同量的腐 eclipse ),而不是仅膨胀。
关于opencv - 如何使用 OpenCV 有选择地应用膨胀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24586923/