【问题标题】:Fast way to get the bounding rectangle of a flood fill获取洪水填充的边界矩形的快速方法
【发布时间】:2016-02-16 08:00:55
【问题描述】:

我需要对图像的某个区域执行泛光填充。但是我实际上并不需要生成的图像,我只需要知道包含所有将被洪水填充更改的像素的最小矩形。

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

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

Sample input image. The red dot is the start pixel. The area to be filled is the cyan Z-tetromino that contains the dot http://www.finnw.me.uk/ffinput.pngSample output. Only the position/width/height of the red rectangle is significant http://www.finnw.me.uk/ffoutput.png


编辑: 带有岛屿的示例 #2:
Example input with islands http://www.finnw.me.uk/ffinput2.png Example output http://www.finnw.me.uk/ffoutput2.png

示例 #3:
Example of false island http://www.finnw.me.uk/ffinput3.png


编辑

抱歉,图像因硬盘故障而丢失。当我第一次发布此内容时,SO 没有托管图片,因此我将它们保存在自己的服务器上。

【问题讨论】:

  • 我发现这样的问题非常有趣。我们可以通过观察立即确定边界矩形是什么,但我们很难确定一个算法。

标签: algorithm image-processing flood-fill


【解决方案1】:

基本上你需要确定最大X、最大Y、最小X和最小Y。

找到真实边缘的右下角:

您可以通过在颜色内尽可能向右+向下移动来做到这一点。

当您不能再向右+向下时,您需要检查以确保您没有被困在孤岛的角落。要检查这一点,您需要沿着整个边缘寻找机会向右+向下移动。每次发生这种情况时,您都可以跟踪 (biggestX, largeY,smallestX,smallestY),以防您真正拥有优势。

如果你真的有一个岛,你最终会在边缘找到一个可以向右+向下走的地方。

如果你没有机会向右+向下走,并且你到达了起点,那么你就有了真正的优势。并且您已经计算出您的 (biggestX、maximumY、smallestX 和 minimumY)。

【讨论】:

  • 抱歉,示例图像失败;它将返回 整个 输入图像,因为其中一个角会在每次通过时接触一个或多个相邻形状。这就是我选择该图像作为示例的原因。
  • 我想你误解了我的回答。您将访问每个像素。 “继续调用此函数,直到您的颜色有 0 个邻居”,尽管您例如停止在右侧像素上调用该函数,但您将在所有相邻像素上的右侧像素上调用它。我的方法不是很有效,因为你会访问每个像素。
  • 如何检测你击中的边缘是否属于一个岛?
  • 您可以通过查看您所击中的边缘上的任何点是否比您当前所拥有的点具有更多的底部+右点(不是边界)来检测它是否是一个岛你开始了边缘追踪。
  • 我认为这可行,只要在确定它是否是孤岛之前跟踪整个边缘(如果中途停止,在某些情况下可能会导致无限循环,例如一个螺旋形的岛屿。)
【解决方案2】:

一种可能的方法是从起点尽可能远(左、上、下、右),然后顺时针或逆时针沿着边缘移动,直到返回第一个边缘点。遍历边缘时跟踪 min(X,y) 和 max(X,Y)。

这应该可以让你看到更少的像素,除非你有相当奇怪的形状要填充。

【讨论】:

  • 很有趣,但我认为它需要修改才能与我的第二个示例一起使用,否则它将返回一个包含一个或多个岛屿但不包含整个区域的框。
  • 它发生的地方可能有一些可以想象的形状,但在第二个例子的具体情况下,它应该撞到一个“岛”,然后转身去边界,然后沿着边界走。跨度>
猜你喜欢
  • 2021-12-28
  • 2019-10-26
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 2022-09-30
  • 2020-04-02
  • 2011-08-16
  • 1970-01-01
相关资源
最近更新 更多