0

我有一些图像,我想在外边缘周围画一个多边形。图像本身位于透明背景上,我在图像中创建了一个像素数组,其中包含一个点并且不透明(或白色)。

现在,我的问题是:如何在外边缘点周围绘制一个准确的多边形?我使用了我读到的格雷厄姆扫描算法来在边缘周围创建一个凸包,但这似乎不适用于具有凹面的物体。例如:

http://i48.tinypic.com/4s0lna.png

左侧的图像使用此方法填充右侧的图像。如您所见,它“填充”有点过多。

我认为必须有一些其他算法或方法可以用来解决这个问题,但我不确定在哪里看或它可能被称为什么。谁能指出我正确的方向?我正在使用 C#/.net,希望可能已经存在一些可以按照这些思路工作的东西。

4

2 回答 2

2

我认为 2D“Alpha 形状”算法将是您的正确选择。

http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Alpha_shapes_2/Chapter_main.html

Alpha 形状可以被认为是“凸壳”算法的概括,它允许生成更一般的形状。

通过使用 alpha 形状,您将可以通过更改 alpha 参数值来控制最终形状要捕获的细节级别。

您可以在这里尝试 Java 小程序:http: //cgm.cs.mcgill.ca/~godfried/teaching/projects97/belair/alpha.html

更好地了解该算法是否有效。

于 2012-10-27T10:41:45.303 回答
1

您可以使用洪水填充方法从逐个像素级别开始。

Start in the corner, checking that it does have zero alpha.
Check the neighbours for zero alpha and iterate until we have no unchecked neighhours.

这为您提供了一个图像蒙版,该蒙版由两个简单连接的区域组成,内部和外部。

然后,您寻求的集合包括:

   all the points in the exterior which are on the boundary of the interior.

然后,您可以通过以下方式将其转换为多边形:

Take an initial polygon that consists of all the points in the edge set
Remove redundant vertices that lie along straight edges.
于 2012-06-19T04:44:20.143 回答