填充凸形的有效方法

时间:2012-03-15 14:28:57

标签: c++ graphics opencv visualization computational-geometry

假设我有一个封闭的形状,如下图所示,我有边缘像素。填充形状的最有效方法是什么,即在形状内打开像素:

1)我有所有边缘像素

2)我有大部分边缘像素而不是所有边缘像素(如图所示)。

enter image description here

5 个答案:

答案 0 :(得分:4)

构造凸包并添加缺少的像素。然后使用扫描线算法填充多边形。

答案 1 :(得分:2)

这一切都取决于具体情况。

如果手动创建帧缓冲区(基本上使用字节数组或类似的东西),则必须遍历要更改的所有像素。因此,例如,从行的最左边开始:

  • 在行上查找形状开始
  • 向右跳一个并打开像素,直到在行(或行尾)上找到第二个形状结束
  • 继续下一行

这当然只有你有所有边缘像素才有效。看看Marching Squares,可以提供一些帮助。

请更具体一点。 “填充形状的最有效方法”取决于您的基础渲染库,如果它是光栅图形等等......

修改的 注意,如果你可以生成边缘像素,算法要快得多,那么就不需要寻找边缘的开始。

答案 2 :(得分:2)

标准flood fill算法在凸形状上非常有效,并且可以处理形状比预期更不凸的情况。不幸的是,它需要不间断的轮廓。

答案 3 :(得分:1)

  1. 如果“内部”这个词,边界中断会破坏意义。
  2. 像人类视网膜一样的神经网络在进行这种处理时非常有效。
  3. 在计算机上,您需要花时间来定义“内部”的含义。差距有多大?边界有多么扭曲?
  4. 模拟一个在“内部”周围弹跳的较大的圆形虫 - 太大而不能通过间隙但小于边界的最小曲率半径????

答案 4 :(得分:0)

在填充内部物之前,您需要确定确切的边界,在这种情况下,这将构成识别圆圈。

之后,您可以在圆圈周围查看每个像素的框,如果它实际上在其中。因为您必须对圆内的每个像素执行某些操作,并且圆中像素的数量与边界正方形的像素数呈线性关系(假设边界正方形的边具有某个常数的长度'半径*常数'),应该接近最佳状态。