【问题标题】:Filling rectangle with points pattern用点图案填充矩形
【发布时间】:2012-10-19 18:51:10
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我不清楚你想要什么。在第二个示例中,我无法说出您想要什么。在示例 1 和 3 中,“错误”点似乎与其他点的网格图案不匹配。在这些情况下什么是正确的?
  • Nicolas:是的,网格几乎是正交的。 Rafael:正如我所说,第二个例子是极端的。在 ex 1 和 3 中,目标是消除错误点并填充网格。

标签: algorithm geometry


【解决方案1】:

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

这些是步骤:

  • 旋转所有东西,这样你就只有水平线和垂直线了。

  • 每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 点做 错误点 = (point.x mod XgridSize != 0) 或 (point.y mod YgridSize != 0)

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

【讨论】:

    【解决方案2】:

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

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

    因此,您可以为两组平行线中的每一个设置方向、周期和偏移量。要使用适当的点填充矩形,只需获取这些线组的交点即可。

    【讨论】:

    • 正如我所说,它与计算机视觉无关。没有必要检测任何东西。我有一组点和模式方向。我宁愿进入一些统计数据来找出哪些点是好的,并从这些信息中创建模式。你的解决方案有点太理论化了。
    猜你喜欢
    • 2023-03-23
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2011-06-30
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多