使用N个点从图像创建凹多边形

时间:2012-04-27 18:17:59

标签: algorithm polygon

我正在寻找一种算法,该算法将从图像生成凹多边形(具有N个点,其中N> 3 - 用户输入该值)。

我对算法的想法:

 // Every pixel in image is checked and a minimal orientated bounding box  is generated  (transparent pixels are ignored)
 boundingBox = createImageBoundingBox(image);
 curpoints = 4, A = 0, B = 1, tmppoints = curpoints;
 while(curpoints < maxNumberOfPoints)
 { 
    add a new point between point A and point B (A and B are points from the boundingBox)
    reposition points so that it will contain the minimal surface
    A++; B++;
    curpoints++;

    if(A == tmppoints) 
    { A = 0; B = 1; tmppoints=curpoints; }
 }  

我面临的问题是我不知道如何最佳地重新定位点。这可以做任何其他(更好/更快的方式)。非常感谢任何想法。

谢谢

编辑:

图像必须至少为10x10。我需要N点参数,因此用户可以调节将要使用的点数(用于优化)。另一种方法是使用一个因子(0-1)来说明你希望多边形有多少详细(多少点)(0为4点,> 0 5或更多点)。但不确定如何实现它。

3 个答案:

答案 0 :(得分:2)

您可以使用delaunay三角测量并获得平均边长。然后尝试去除比平均值更长的边缘。这个概念来自alpha形状。

答案 1 :(得分:1)

1。)选择方形图像中间的一个点。

2。)从中心随机抖动此点N次以产生N个新点。

3.。)根据距中心点的最大角度

对这些点进行排序

4。)使用边界框中的四个点和按升序角度顺序排列的中点来创建凹多边形的有序点列表。

我不确定我是否理解上面的“最小表面”步骤,但我相信这个算法可以用于剪切图像以生成凹多边形。我认为这比你的更快,但我不确定,因为我完全不明白这一步。

这将始终生成与原始图像具有相同边界的凹多边形。如果您不想这样,可以添加一个步骤0.),它会抖动您的边界框,然后根据此更改您的中点抖动。我认为,这两个想法都会产生一个边界四边形,并且取出了一个n尺寸的点块。

  • 这需要n> 4(如果你希望这个要求n> 3,你可以将你们两个边界框分成一个,就像你说的那样。)

答案 2 :(得分:1)

可以使用alpha shapes构建凹面外壳。 CGAL link.