Algorithm 用点填充矩形图案

Algorithm 用点填充矩形图案,algorithm,geometry,Algorithm,Geometry,在下面的图片上有一些特定的模式。它在第一张图片上最清晰可见。我用小圆圈标记点,并用线连接。他们制作了一些网状图案。有些点是错误的,不符合模式(标记在第一张图像上)。 目标是填充标有红色标记的整个矩形(矩形是从极值点创建的-在模式坐标系中具有极值坐标的点) 问题是应该采取什么方法来用点填充矩形,并消除错误的点。第二张图片上的情况是极端的,但主要情况下有更多的点。 图像仅用于可视化。我有带点坐标的向量。不需要检测点 一旦我找到一个解决方案,我就会添加我的解决方案 我目前的方法是创建与已知图案偏移

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

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

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

一旦我找到一个解决方案,我就会添加我的解决方案


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

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

执行Hough变换后,将得到一个二维直方图,其中一个维度(列)对应于线方向,其他维度(行)对应于线偏移。将同一列的元素相加,在结果向量中找到两个最大值。将同一行中的元素添加到列中,接近这些最大值之一,并在结果向量中找到周期模式(此处可能有所帮助)。对其他最大值执行相同操作


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

总体而言,我要做的是首先确定网格,然后很容易检查网格上是否有东西

以下是步骤:

  • 旋转所有物体,使你只看到水平线和垂直线

  • 每x值计算您拥有的点数

  • 每y值计算您拥有的点数
伪代码:

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
gridscores[] = 5,5,0,5,34,5,0,5

XgridSize = index of greatest gridSore
  • 现在检测网格大小:

    匹配=0 对于i=1到10 do foreach xcount do 如果xcount mod i=0,则 比赛[i]++

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

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
gridscores[] = 5,5,0,5,34,5,0,5

XgridSize = index of greatest gridSore
  • 34显然是最好的匹配,它在索引5处,所以网格大小是5

  • 现在您已经知道了栅格大小,可以轻松找到哪些点不在该栅格上:

    每个点做什么 错误点=(point.x mod XgridSize!=0)或 (点y模尺寸!=0)


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

正如我所说,这不是与计算机视觉相关的问题。不需要检测任何东西。我有一系列的点,还有方向。我宁愿进入一些统计数据,找出哪些点是好的,并根据这些信息创建模式。我认为你的解决方案有点过于理论化。我不清楚你想要什么。在你的第二个例子中,我说不出你想要什么。在示例1和3中,“错误”点似乎与其他点的栅格模式不匹配。在这种情况下,什么才是正确的呢?尼古拉斯:是的,网格几乎是正交的。拉斐尔:正如我所说,第二个例子是极端的。在ex 1和3中,目标是消除错误点并填充网格。