高效实现matlab函数“imfill(BW,'holes')”在c ++中不使用opencv

时间:2014-05-28 09:16:26

标签: c++ algorithm matlab

我需要有效地实现matlab的填充(BW,' hole')功能,填充"""在二进制图像(0,1)。

二进制图像表示为0和1s的2D矩阵,其中1表示白色(明亮)区域,0表示黑色(暗)区域。

洞基本上是"黑暗"被" bright"包围的区域区域。换句话说,被1s包围的0是一个"孔"。孔的另一个定义是:暗区(0s),除非我们穿过一些明亮区域(1s),否则无法通过四个边缘中的任何一个到达。边缘总是黑色(0s)。

现在我需要找到孔(0s被1围绕)并填充这些孔(将这些0设为1)。

有可能有效的算法吗? 请帮忙。 提前谢谢。

实施例: 您可以点击以下链接获取示例:go to the bottom of the page and expand example: Fill Holes in a Binary Image

2 个答案:

答案 0 :(得分:1)

似乎简单的方法是:

  • 从具有背景值的某个边缘点做FloodFill(在存在未填充的背景边缘像素时重复)

  • 使用填充像素创建遮罩

  • 绘制除了用前景色掩盖的所有内容

答案 1 :(得分:1)

严格地说,填充填充是最佳的,因为您必须检查要填充的区域内的每个像素,以便它是Omega(N)问题,并且填充填充在O(N)时间内回答它。 / p>

如果您担心的是每个像素都会访问4个或8个邻居,请查看维基百科页面中的备选方案。特别是扫描线填充(但是IMO,声明“效率:每次检查每个像素一次”是错误的。)

通过将图像压缩为您将使用connected component labeling方法分组的运行,还可以设计每个像素一次访问的纯扫描填充。

任何这些方法的原始速度将取决于实施的质量,不能给出先验规则。

另请参阅种子填充算法here