在不使用OpenCV的C++中高效实现MATLAB函数"imfill(BW,'holes') "

efficient implementation of matlab function "imfill(BW,'holes') " in c++ not using opencv

本文关键字:imfill BW 函数 holes MATLAB OpenCV C++ 实现 高效      更新时间:2023-10-16

我需要实现matlab的高效imfill(BW,'holes')函数,该函数填充二值图像(0,1)中的'holes'。

二值图像表示为0和1的二维矩阵,其中1表示白色(亮)区域,0表示黑色(暗)区域。

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

现在我需要找到洞(0被1s包围)并填充这些洞(把这些0变成1s)。

是否存在有效的算法?请帮助。提前谢谢。

的例子:您可以按照下面的链接查看示例:转到页面底部并展开示例:在二进制图像中填充孔

似乎最简单的方法是:

  • 从具有背景值的边缘点进行泛洪填充(在未填充的背景边缘像素存在时重复)

  • 创建填充像素的蒙版

  • 用前景色画除蒙版以外的所有部分

严格来说,洪水填充是最优的,因为你必须检查要填充区域内的每个像素,使其成为Omega(N)问题,并且洪水填充在O(N)时间内解决它。

如果你担心的是每个像素要访问4或8个邻居,那么看看维基百科页面上的替代方案。特别是扫描线填充(但在我看来,"效率:每个像素检查一次"的说法是错误的)

也可以设计一个纯扫描填充,通过将图像压缩成运行,您将使用连接组件标记方法进行分组。

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

还可以查看这里的种子填充算法