【发布时间】:2012-04-01 02:02:06
【问题描述】:
假设我有一个封闭的形状,如下图所示,我有边缘像素。填充形状的最有效方法是什么,即在以下情况下将像素“打开”在形状内:
1) 我有所有的边缘像素
2) 我拥有大部分边缘像素,而不是全部(如图所示)。
【问题讨论】:
标签: c++ graphics opencv visualization computational-geometry
假设我有一个封闭的形状,如下图所示,我有边缘像素。填充形状的最有效方法是什么,即在以下情况下将像素“打开”在形状内:
1) 我有所有的边缘像素
2) 我拥有大部分边缘像素,而不是全部(如图所示)。
【问题讨论】:
标签: c++ graphics opencv visualization computational-geometry
构造凸包并添加缺失的像素。然后使用扫描线算法填充多边形。
【讨论】:
标准的flood fill 算法在凸形上非常有效,并且可以处理凸形不如预期的情况。不幸的是,它需要一个完整的轮廓。
【讨论】:
这一切都取决于情况。
如果您手动创建帧缓冲区(基本上使用字节数组或类似的东西),您必须遍历所有要更改的像素。因此,例如,从一行的最左边开始:
这当然只有在您拥有所有边缘像素时才有效。看看Marching Squares,可以帮到你。
请说得更具体一些。 “填充形状的最有效方法”取决于您的底层渲染库,如果它是光栅图形等等......
编辑 注意,如果可以生成边缘像素,算法会快很多,那么就不需要寻找边缘的起点了。
【讨论】:
【讨论】:
在填充物体的内部之前,您需要确定确切的边界,在这种情况下,这将构成识别圆。
之后,您只需检查每个像素的圆圈周围的框,如果它确实在其中。由于您必须对圆内的每个像素进行处理,并且圆中的像素数与边界正方形的像素数成线性关系(假设边界正方形的边的长度为“半径 * 常数”以表示某个常数),这个应该接近最优。
【讨论】: