如何通过网格点生成线段

时间:2016-11-16 04:06:10

标签: algorithm grid geometry gridlines

我正在尝试按网格点生成网格线段。我有34个这样的点:

enter image description here

图片尺寸为720 * 480,有34个网格点,坐标如下:

323.708 205.925
382.585 206.75
320.296 216.596
381.729 217.499
271.118 227.4
286.04 227.643
301.208 227.631
316.538 228.165
332.195 228.323
348.114 228.828
364.194 229.139
380.893 229.356
397.731 230.219
414.795 230.634
432.307 231.407
312.507 241.026
379.886 242.892
307.735 254.944
378.838 257.705
251.514 268.437
268.271 269.035
285.124 269.701
302.801 270.563
320.684 271.637
339.107 272.332
358.067 273.122
377.46 274.347
397.01 275.033
416.814 276.199
437.558 277.354
297.437 288.028
375.766 292.266
291.296 307.268
374.233 313.316

我尝试过Hough变换来检测网格线。 但我只需要一张图片,表明点之间的间隙已经填满(就像这样):

enter image description here

enter image description here

这样我才能完成下一步的工作。使用霍夫变换有点浪费。

我尝试使用线性插值来填补空白,但我需要手动查找端点。因此,我想知道如何仅通过这些网格点自动生成网格线段。

2 个答案:

答案 0 :(得分:1)

为每个点找到N,S,E,W方向上的最近点,如果列表中尚未存在,则将行添加到列表中。如果n是点数,我会看到它:

  1. 循环i = <0,n-2>
  2. 循环j = <i+1,n-1>
  3. 每个轴方向
  4. 添加大小|pnt[i1]-pnt[i1]|小于或等于网格大小的任何行,同时该行的方向类似于实际方向NSWE所以:

    abs(dot(direction/|direction|,(pnt[i1]-pnt[i1])/|pnt[i1]-pnt[i1]|))
    
    如果方向向量不精确,

    接近1或至少大于0.75。作为方向,你可以开始:

    NS = ( 0.0, 1.0 )
    WE = ( 1.0. 0.0 )
    

    NS方向更偏离,因此您可能应该使用更大的余量进行比较。

    你可以摆脱单位向量的点积内的标准化

答案 1 :(得分:0)

你已经知道重点,所以霍夫变换是非常有用的。

如果只有34个(甚至数百个)点,它们形成大约1000对,你可以为每一对构建线,然后在没有任何复杂算法的情况下将这些线聚集在rho-theta空间中(这种方法是二次的)。您将拥有4个大型集群,并且不难发现这些集群中的哪些线段(点)正在结束。

对于较大的数据集,您可以以随机的方式为小的随机点子集形成初始聚类,然后将每个点添加到它适合的最佳线(线性方法)