Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ matlab函数的高效实现";填充(BW、孔和孔);在c++;不使用opencv_C++_Algorithm_Matlab - Fatal编程技术网

C++ matlab函数的高效实现";填充(BW、孔和孔);在c++;不使用opencv

C++ matlab函数的高效实现";填充(BW、孔和孔);在c++;不使用opencv,c++,algorithm,matlab,C++,Algorithm,Matlab,我需要高效地实现matlab的imfill(BW,'holes')函数,它可以填充二值图像(0,1)中的“空洞” 二值图像表示为0和1s的2D矩阵,其中1表示白色(亮)区域,0表示黑色(暗)区域 洞基本上是一个由“亮”区域包围的“暗”区域。换句话说,0被1包围是一个“洞”。洞的另一个定义是:一个黑暗区域(0s),除非我们穿过一些明亮区域(1s),否则无法通过四条边中的任何一条到达。边始终为黑色(0) 现在我需要找到洞(0被1包围)并填充这些洞(使这些0成为1) 有没有可能的有效算法? 请帮忙。

我需要高效地实现matlab的imfill(BW,'holes')函数,它可以填充二值图像(0,1)中的“空洞”

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

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

现在我需要找到洞(0被1包围)并填充这些洞(使这些0成为1)

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

例如:
您可以按照下面的链接进行示例:

似乎简单的方法是:

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

  • 使用泛光填充像素创建遮罩

  • 除蒙版外,使用前景色绘制所有


严格地说,泛光填充是最佳的,因为您必须检查待填充区域内的每个像素,以便这是一个
Omega(N)
问题,泛光填充在
O(N)
时间内解决

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

还可以通过将图像压缩为运行,然后使用一种方法分组,从而设计一个每像素一次访问的纯扫描填充

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


还可以查看种子填充算法。

仅从“某个背景点”开始是不够的,因为背景可能由几个不相交的部分组成。您必须尝试所有(到目前为止尚未填充)边缘pixels@YvesDaoust我看到了这个问题,但对于所有情况都没有通用的解决方案(例如,大甜甜圈触摸窗口边缘会产生5个背景区域)@Yves Daoust好的,这种方法似乎可靠地替代了,您可以用一个像素大的背景色轮廓环绕图像,然后从那里填充。@Yves Daoust这正是我遵循的方法,它可以工作。但我想知道是否有更好的方法。因为在这个例子中,你每次都需要检查一个像素的所有邻域,如果可能的话,可以避免使用像素的顺序访问,如果有的话。扫描线填充并不能解决这个问题。为此,您需要知道要填充的多边形,并且知道多边形(“孔的周长”)是任务。种子填充也是一种不相关的问题。但是谢谢你的努力。我想洪水填充法就足够了。@gmaster:我不喜欢你在没有阅读我的参考资料的情况下发表评论。维基百科中的扫描线填充是一种泛洪填充算法,经过优化以减少访问次数。种子填充是洪水填充的同义词。