使用C#的图像/形状的外边界点

时间:2012-06-18 19:56:40

标签: c# drawing geometry polygon

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

现在,我的问题是:如何在外边缘点周围绘制精确的多边形?我已经使用了Graham Scan algorithm来描述在边缘周围创建凸包,但这似乎不适用于具有凹陷的对象。例如:

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

左侧的图像使用此方法填入右侧的图像。正如你所看到的,它“填补”了一点点。

我认为必须有一些其他算法或方法可用于解决这个问题,但我不确定在哪里查看或者可能会调用它。有人能指出我正确的方向吗?我正在使用C#/ .net,希望可能存在一些可以在这些方面工作的东西。

2 个答案:

答案 0 :(得分: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

更好地了解这个算法是做什么的。

答案 1 :(得分: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.