我需要有效地实现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
答案 0 :(得分:1)
似乎简单的方法是:
从具有背景值的某个边缘点做FloodFill(在存在未填充的背景边缘像素时重复)
使用填充像素创建遮罩
绘制除了用前景色掩盖的所有内容
答案 1 :(得分:1)
严格地说,填充填充是最佳的,因为您必须检查要填充的区域内的每个像素,以便它是Omega(N)
问题,并且填充填充在O(N)
时间内回答它。 / p>
如果您担心的是每个像素都会访问4个或8个邻居,请查看维基百科页面中的备选方案。特别是扫描线填充(但是IMO,声明“效率:每次检查每个像素一次”是错误的。)
通过将图像压缩为您将使用connected component labeling方法分组的运行,还可以设计每个像素一次访问的纯扫描填充。
任何这些方法的原始速度将取决于实施的质量,不能给出先验规则。
另请参阅种子填充算法here。