最好的“桶填充”算法是什么?


16

我对图像处理还很陌生,目前正在研究类似油漆的应用程序,该应用程序将具有桶装功能。但是,我不知道什么是最好的填充算法。

我实现了一个从该站点发现的示例,但是,当用户尝试对一个已经用相同颜色进行桶装的区域进行桶装时,它遇到了无限循环问题。

我目前正在通过左,右,上,下填充来解决该问题。但是,我这样做是为了使像素一旦填充到左侧,就不能填充到右侧,这意味着形状如下:

例

如果在红点处使用铲斗工具,将无法正确填充。

因此,我希望有人知道可以解决所有这些问题的算法或算法的链接。

附加信息:这将使用Javascript作为绘画工具来实现。它将通过Canvas元素在线使用。


该矢量或位图基于吗?我通过图像假设位图,但只是确保..
德棉布莱希特

1
我认为您实施的方法有误。我对文档进行了略读,并根据图像示例,这应该像上面的图像一样填充图像。您复制并粘贴了他的代码,还是重新编写了代码?
RLH

考虑图遍历。
2011年

@RLH:我复制并粘贴了他的代码,进行了一些更改,以使其与我的设置兼容。
伊凡

@Ivan:在解决“无限循环”问题之前,不要开始寻找新的算法。如果甚至不能解决现有实现的问题,那么从头开始重写整个过程肯定会遇到更多麻烦。
Doc Brown

Answers:


21

听起来您实际上正在寻找所谓的“洪水填充”算法。这也许就是为什么您没有找到很多例子的原因。该算法Wikipedia页面上列出了几种Flood Fill方法。我强烈推荐一种非递归的“排队”方法。


I highly recommend one of the non-recursive, 'queued' methods.-你能解释为什么吗?
Elfayer

1
@Elfayer每次调用一个函数(例如,“ X()”具有对“ Y()”的调用)时,原始函数(“ X()”)的参数和存储位置都存储在堆栈中。因此,如果您要填充一个大而复杂的空间,那么将有很多递归函数调用。根据您的编译器和语言,这可能导致堆栈溢出或过多的内存消耗。
boxcartenant

-1

我目前正在做同样的事情。但是,当我遇到您指出的问题时,如果在工具上单击与您要绘制的颜色相同的区域单击该工具,我选择简单地结束该函数(这似乎也是ms-paint的行为) 。

对于有一定编程经验的人来说,排队方法应该非常直观。

如果要考虑用与油漆相同的颜色来涂漆周围的区域,则可以:

  • 检查背景色。
  • 搜索您单击的同色斑点的边缘。
  • 将周围的点排到现场。
  • 使用此(在本例中)白点填充的队列继续正常执行。

如果您愿意,可以在这里查看我的代码(非常尴尬) 。

它远非快速,但效果很好...


为什么要下票?:(我知道该方法并不是特别“快速”,但它可以工作,并且可以解决建议的问题:(
Juan Pablo Alvarez Alfaro 2015年

1
这篇文章很难阅读(文字墙)。您介意将其编辑为更好的形状吗?
蚊蚋

2
认真吗 人们因为难以阅读而被否决了?为什么不选择编辑?并不是说内容有问题。
l46kok 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.