问题标签 [flood-fill]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
11635 浏览

python - 区域增长算法

嘿大家。我真的很难弄清楚这个逻辑,并希望你能帮助我。在我继续之前,我只想让你知道我是业余程序员和初学者,没有任何形式的正式计算机科学培训,所以请多多包涵。:D 另外,我正在使用 Python,但我可以使用 Java 或类似的东西。

任何人,我都希望实现一个区域增长,以便在基本的 Drawbot 中使用。这是一篇关于区域增长的文章:http ://en.wikipedia.org/wiki/Region_growth

按照我的设想,绘制所基于的图像将满足以下标准:

  • 在任意颜色深度下,图像的大小最多为 3x3 英寸

  • 图像将是白色背景上的黑色连续形状

  • 该形状可以位于背景上的任何位置。

我考虑了以下解决此问题的方法。虽然有些工作在一定程度上,但每一个在性能或可行性方面都有一些相当大的缺陷(至少它们对我来说似乎不可行)。此外,因为这是一个 Drawbot,所以需要用一条连续的线来完成。然而,这并不意味着我不能回溯,它只是消除了多个起点(种子)的可能性。

考虑的方法:

随机游走:

用随机游走解决这个问题是我的第一直觉。我想,完成此操作的随机游走程序看起来像这样:

伪蟒蛇...

虽然我认为这是可行的,但在我看来这是非常无效的并且不能保证好的结果,但是为了实际完成某些事情,我可能最终会尝试这个......我在伪代码中的逻辑是否甚至模糊正确?

扫地模式:

这种方法对我来说似乎是最容易实现的。我的想法是我可以在形状的一个极端选择一个起点(例如最左边的最低点)。从那里它会向右画,只在 x 轴上移动,直到它碰到一个白色像素。从这里它会在 y 轴上向上移动一个像素,然后在 x 轴上向左移动直到它到达一个白色像素。如果正上方的像素恰好是白色的,则在 x 轴上回溯,直到找到其上方的黑色像素。

经进一步检查,这种方法存在一些重大缺陷。当面对这样的形状时:

图1

结果将如下所示:

图2

即使我告诉它在一段时间后开始扫地,中腿仍然会被忽略。

4/8 连通社区:

http://en.wikipedia.org/wiki/8-connected_neighborhood

这种方法在我看来是最强大和最有效的,但在这一点上我无法完全弄清楚,我也想不出如何在不留下一些被忽视的区域的情况下实现它

在每个单元格中,我都会查看相邻的黑色单元格,设计一些方法来排列我应该首先访问哪个单元格,访问所有单元格,然后重复该过程直到所有单元格都被覆盖。

我在这里可以看到的问题首先是处理完成此任务所需的数据结构,并且还只是弄清楚其背后的逻辑。


这些是我能想到的最好的解决方案。感谢您花时间阅读本文,我意识到它很长,但我认为我应该尽可能明确。任何和所有的建议将不胜感激......谢谢!

编辑:

我还研究了迷宫生成和求解算法,但不确定如何在这里实现。我对迷宫求解算法的理解是,它们依赖于迷宫的通道宽度相等。我当然可能是错的。

0 投票
3 回答
4000 浏览

actionscript-3 - 矢量图形洪水填充算法?

我正在开发一个简单的绘图应用程序,我需要一种算法来进行洪水填充。
用户工作流程将如下所示(类似于 Flash CS,只是更简单):

  1. 用户在工作区上绘制直线。这些被视为矢量,并且可以在绘制后选择和移动。
  2. 用户选择填充工具,然后单击绘图区域。如果该区域被各个方向的线包围,则对该区域应用填充。

如果在应用填充后移动线条,则填充区域会相应更改。

任何人都有一个好主意,如何实现这样的算法?主要任务基本上是确定一个点周围的线段。(并以某种方式存储此信息,以防线条被移动)

编辑:解释图像:(画布中当然可以有其他线条,这与填充算法无关)

在此处输入图像描述

EDIT2:更困难的情况:

在此处输入图像描述

EDIT3:我找到了一种用孔填充多边形的方法 http://alienryderflex.com/polygon_fill/,现在主要问题是,我如何找到我的多边形?

0 投票
2 回答
1344 浏览

iphone - iPad 中的洪水填充太慢了

我在 iPad 上为我的一个着色应用程序使用洪水填充。

该应用程序基本上在图像的黑线内填充颜色,我可以毫无问题地做到这一点,但它太慢了。

我首先使用递归洪水填充,它的性能是最差的(由于堆栈溢出),然后我能够使用堆栈将其转换为迭代,并使用以下代码,但这太慢了

有人会建议一种在 iPad 设备上效果最好的替代方法吗?

0 投票
2 回答
786 浏览

c++ - c++ Floodfill算法最终错误

我的floodfilling算法快完成了,但是某处有一个小错误,我花了大约3个小时调试,但我似乎找不到它!

注意:在阅读时,我使用 0 到 15 的数字来定义墙壁

1 = 顶部 2 = 右侧 4 = 底部 8 = 左侧(所以 13 意味着顶部/底部/左侧墙壁在那里)

我的程序:

  • 它读取字段数以计算最大的房间(因此这里下面的所有内容都是一个循环,会针对字段数重复)。

  • 然后它得到房间的尺寸

  • 现在在类字段中,它创建了一个对象数组(单元格),用于存储周围的墙壁(从左到右向下向上),以及一个低于 16 的值

  • 现在这是我认为问题所在,通过 std::cin 读取值

  • 然后当所有内容都读入时,它会扫描空(0),然后创建一个房间,并检查它周围的可用空间(使用墙壁检查)

  • 最后它返回最大值,我们就完成了。

我使用的输入:

所以发生的事情是某处,在墙上检查,或者创建一个对象 Cell 出了问题(我认为)

这是我的脚本,很抱歉不得不问这样愚蠢的问题!

提前致谢

0 投票
4 回答
5322 浏览

c++ - 用于填充二进制图像的 C++ 算法

我正在尝试模拟一个 matlab 函数“imfill”,用于填充二进制图像(1 和零的二维矩阵)。

我想在矩阵中指定一个起点,然后像 imfill 的 4 个连接版本一样进行填充。

这是否已经存在于 C++ 世界的某个地方?如果不是,那么实现这一点的最有效方法是什么?

0 投票
2 回答
1510 浏览

delphi - Delphi - 渐变填充?

有没有办法在 D2007 中使用 Canvas.FloodFill 用渐变颜色填充自定义形状的对象。从白色变为边框颜色。我无法谷歌出任何有用的东西。

或者只是用渐变颜色填充自定义形状对象的任何其他方式?

谢谢你。

0 投票
1 回答
1054 浏览

jquery - jQuery洪水填充算法

我将如何开始使用 jQuery 为表格单元格执行填充算法?

当前,当用户单击表格单元格时,如果该单元格为空,则其相邻单元格将被覆盖。我发现让它工作的一种方法是重复每个相邻方块的代码(我已经注释掉这部分代码),然后重复代码,重复代码.....尽管它变得没有响应.

我正在尝试用 jQuery 制作一个扫雷游戏,有人向我提到了一种洪水填充算法,尽管我不确定如何实现这一点。

0 投票
1 回答
1140 浏览

graphics - 考虑 alpha 而不在抗锯齿线周围留下边缘的填充算法?

我已经实现了一个典型的洪水填充算法,当我使用 ARGB 组件之间的欧几里德距离来比较颜色时,它在使用纯色时按预期工作。

我的问题是,如果您在透明背景上绘制抗锯齿红线之类的东西,我的泛光填充算法将不会填充大多数半透明像素,从而在对象周围留下条纹。特别是对于这个例子,线条的中心是纯红色(即 ARGB 格式的 (255, 255, 0, 0)),线条的边缘也是纯红色,但这些像素的 alpha 范围低至 1% alpha (即 (1, 255, 0, 0))。一般来说,我希望能够绘制一个抗锯齿的圆形轮廓,在中心填充填充而不让它留下边缘。

我使用什么函数来比较颜色和/或如何调整泛光填充算法,以便不会在对象周围留下这样的边缘?

我试过告诉算法,如果它的 alpha <90%,总是填充一个像素,这有时看起来不错,但它在填充微弱的线条时过于激进。

编辑:为了详细说明 0 - 5 代表红色像素 0、20、40、60、80 和 100% alpha 的情况,抗锯齿红线的图像可能如下所示:

0 0 0 0 0 0 0

0 0 0 3 0 0 0

0 0 3 5 3 0 0

0 0 3 5 3 0 0

0 0 3 5 3 0 0

0 0 0 3 0 0 0

0 0 0 0 0 0 0

我当前在左上角填充红色的洪水填充算法会将所有 0 替换为 5。剩余的 3 会在线周围形成一个难看的光环。

0 投票
1 回答
1871 浏览

java - 图像填充后颜色不同

我一直在玩我在 Stack Overflow 上找到的图像泛洪填充。

我认为代码不是问题。虽然如果你有一个更好的,我会很高兴看到(或者如果你知道一个有这种图像处理类型的库,那就更好了)。

我的问题是,在我对这张图片运行算法之后,这个人的头盔不是绿色的,而是浅灰色的。

我已经在 Paint 中创建的一个愚蠢的例子上尝试过它,它工作正常。因此,我认为一定有一些图像设置或类似的东西会改变我在算法中设置的 rgb 值。

您对代码中应该设置的内容有什么建议(请参见下文)?

这是我在测试中使用的图像。我在测试中使用的图像.

0 投票
2 回答
1634 浏览

c++ - Flood filling of 3-dimensional polygon

here is a problem for you ;)

I have a 3-dimensional array filled with 1s and 0s. The 1s represent 3 dimensional complex polygons ( not simple polygons ). Only the boundaries of the polygons have the value 1, the inside is filled with 0s. Now here is the problem:

I need a fast algorithm to flood-fill these polygons with 1s. The arrays usually have a dimension of approx. 512x512x100.

Thanks in advance!

Here is an example in 2d:

0000111110000
0000100010000
0000100010000
0000111110000

should result in

0000111110000
0000111110000
0000111110000
0000111110000


is this the correct 3 dimensional solution for @Mikolas algorithm?

}

Best regards,

stef