用点图案填充矩形

时间:2012-10-30 12:22:31

标签: algorithm geometry

在下面的图片上有一些特定的图案。它在第一张图像上最佳。我有点标记小圈并与线连接。他们做了一些净模式。有些点是错误的,不适合图案(在第一张图片上标记)。 目标是填充标有红色的整个矩形(矩形是从极值点创建的 - 在图案坐标系中具有极值坐标的点)。

问题是应该采用什么方法用点填充矩形,并消除错误的点。第二张图像的情况极端,但主要是情况更多。

图像仅用于可视化。我有矢量点坐标。无需检测点。

我会在找到答案后立即添加我的解决方案。

我目前的做法是创建与较长矩形边平行的线,并且已知模式偏移。然后寻找在线附近有一些增量距离的点,并填充其余点。

2 个答案:

答案 0 :(得分:2)

总的来说,我要做的是首先确定网格,然后很容易检查网格上是否有某些内容。

以下是步骤:

  • 旋转所有内容,这样您就只能获得水平和垂直线条。

  • 每x值计算您有多少点。

  • 每个值计算您有多少积分。

伪码:

xcount is array of int
ycount is array of int

for x=0 to width-1 do
  for y=0 to height-1 do
    foreach point do
      if point.x = x then
        xcount[x]++
      if point.y = y then
        ycount[y]++ 

对于你的上一张图片,结果将是这样的:

x-count:1,0,0,0,3,0,2,0,1,0,0,0,4,0,0,0,3,0,0,0,4
y-count:2,0,0,0,6,0,0,0,4,0,1,0,3,0,1,0,1
  • 现在检测网格大小:

    匹配= 0 对于i = 1到10   foreach xcount做     如果xcount mod i = 0那么       比赛[I] ++

现在我们有一个数组,其中包含10种不同网格大小的分数(匹配的点数)。它可能看起来像这样:

gridscores[] = 5,5,0,5,34,5,0,5

XgridSize = index of greatest gridSore
  • 34显然是最佳匹配,它在索引5处,因此网格大小为5.

  • 现在您已了解网格大小,您可以轻松找到该网格上没有的点:

    foreach指点    wrongpoint =(point.x mod XgridSize!= 0)或                 (point.y mod YgridSize!= 0)

即使有很多错误点,这也有效。我没有详细介绍如何旋转以及如何找到网格的偏移量,但这可能会帮助您找到正确的方向。

答案 1 :(得分:1)

这些点位于两组平行线上。检测这些行的最简单方法是Hough transform

执行Hough变换后,您有一个2D直方图,其中一个维度(列)对应于行方向,其他维度(行)对应于行偏移。将相同列的元素添加到一起,并在结果向量中找到两个最大值。将相同行的元素添加到列中,接近其中一个最大值,并在结果向量中查找周期性模式(Fast Fourier transform可能有帮助)。对其他最大值做同样的事情。

因此,您有两组平行线的方向,周期和偏移。要用适当的点填充矩形,只需获得这些行集的交集。