我有一些图像,我想在外边缘绘制一个多边形。图像本身位于透明背景上,我在图像中创建了一个像素数组,其中包含一个点并且不是透明的(或白色)。
现在,我的问题是:如何在外边缘点周围绘制精确的多边形?我已经使用了Graham Scan algorithm来描述在边缘周围创建凸包,但这似乎不适用于具有凹陷的对象。例如:
http://i48.tinypic.com/4s0lna.png
左侧的图像使用此方法填入右侧的图像。正如你所看到的,它“填补”了一点点。
我认为必须有一些其他算法或方法可用于解决这个问题,但我不确定在哪里查看或者可能会调用它。有人能指出我正确的方向吗?我正在使用C#/ .net,希望可能存在一些可以在这些方面工作的东西。
答案 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.