快速获取泛洪填充的边界矩形的方法

4

我需要对图像的某个区域执行泛洪填充。 但是,我实际上并不需要生成结果图像,我只需要知道包含所有受泛洪填充影响的像素的最小矩形。

是否有一种泛洪填充算法的变体可以比完整的泛洪填充更便宜地计算出此矩形?

示例输入和输出(仅需要红色矩形):

样例输入图像。红点是起始像素。要填充的区域是包含该点的青色Z形方块 http://www.finnw.me.uk/ffinput.png示例输出。仅位置/宽度/高度的红色矩形是重要的 http://www.finnw.me.uk/ffoutput.png


编辑:带有岛屿的示例2:
带有岛屿的输入示例 http://www.finnw.me.uk/ffinput2.png 输出示例 http://www.finnw.me.uk/ffoutput2.png

示例3:
错误岛屿示例 http://www.finnw.me.uk/ffinput3.png


编辑

很抱歉,由于硬盘故障,图片丢失了。当我首次发布这篇文章时,SO并没有提供图片托管服务,所以我将它们放在自己的服务器上。


1
我觉得这类问题非常有趣。我们可以通过观察立即确定边界矩形,但很难确定一个算法。 - Brian R. Bondy
2个回答

2
基本上你需要确定最大的X值,最大的Y值,最小的X值和最小的Y值。
找到真正边缘的右下角:
您可以通过在您的颜色内尽可能向右+向下移动来实现此目标。
当您无法再向右+向下移动时,您需要检查是否卡在岛屿的角落里。为了检查这一点,您需要沿着整个边缘寻找机会向右+向下移动。每次发生这种情况时,您可以跟踪(biggestX、biggestY、smallestX、smallestY),以防您实际上拥有真正的边缘。
如果您确实有一个岛屿,您最终会找到一个沿着边缘走的地方,可以更多地向右+向下移动。
如果您没有机会向右+向下移动,并且到达起始点,则您已经找到了实际边缘。并且您已经计算出了您的(biggestX、biggestY、smallestX和smallestY)。

抱歉,但这对于示例图像失败了;每次传递时,其中一个角将接触到一个或多个相邻形状,因此它将返回整个输入图像。这就是我选择该图像作为示例的原因。 - finnw
我认为你误解了我的回答。你将访问每个像素。即使你停止在右侧像素上调用函数,但你会在所有相邻的像素上调用它,直到你的颜色没有相邻的像素。虽然我的方法不是很有效率,因为你将访问每个像素。 - Brian R. Bondy
你如何检测所撞到的边缘是否属于一个岛屿? - finnw
1
通过检查你所击中的边缘上是否有任何一个点比你开始追踪边缘时拥有的更底部和右侧的位置(不是边界),你可以检测出它是否为岛屿。 - Brian R. Bondy
我认为这个方法可行,只要你在判断是否为孤岛之前追踪整个边缘(如果你中途停止,可能会导致某些情况下的无限循环,例如螺旋形的孤岛)。 - finnw
显示剩余3条评论

1

一个可能的方法是从起点尽可能向左、上、下、右四个方向走,然后顺时针或逆时针沿着边缘走直到回到第一个边缘点。在遍历边缘时跟踪最小值(X,Y)和最大值(X,Y)。

这应该能让您查看更少的像素,除非您有相当奇怪的形状需要填充。


有趣,但我认为需要修改以适应我的第二个示例,否则它将返回一个包含一个或多个岛屿而不是整个区域的方框。 - finnw
可能有一些可以想象的形状,但是在第二个例子中,它应该碰到一个“岛屿”,然后转向并前往边界,然后沿着边界走。 - Vatine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接