3

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

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

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

我会尽快添加我的解决方案。

我目前的方法是创建平行于具有已知图案偏移的较长矩形边的线。然后寻找线附近具有一定增量距离的点,并填充其余点。

4

2 回答 2

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
  • 现在检测网格大小:

    match = 0 for i=1 to 10 do foreach xcount do if xcount mod i=0 then matches[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)

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

于 2012-10-30T15:17:19.740 回答
1

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

执行霍夫变换后,您有一个二维直方图,其中一维(列)对应于线方向,另一维(行)对应于线偏移。将同一列的元素相加,并在结果向量中找到两个最大值。将列的同一行的元素加在一起,接近这些最大值之一,并在结果向量中找到周期性模式(快速傅里叶变换在这里可能会有所帮助)。对其他最大值执行相同操作。

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

于 2012-10-30T13:13:47.877 回答