在下面的图片上有一些特定的图案。它在第一张图像上最佳。我有点标记小圈并与线连接。他们做了一些净模式。有些点是错误的,不适合图案(在第一张图片上标记)。 目标是填充标有红色的整个矩形(矩形是从极值点创建的 - 在图案坐标系中具有极值坐标的点)。
问题是应该采用什么方法用点填充矩形,并消除错误的点。第二张图像的情况极端,但主要是情况更多。
图像仅用于可视化。我有矢量点坐标。无需检测点。
我会在找到答案后立即添加我的解决方案。
我目前的做法是创建与较长矩形边平行的线,并且已知模式偏移。然后寻找在线附近有一些增量距离的点,并填充其余点。
答案 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可能有帮助)。对其他最大值做同样的事情。
因此,您有两组平行线的方向,周期和偏移。要用适当的点填充矩形,只需获得这些行集的交集。