问题有两个不同大小的点集(为简单起见为2D)散布在两个不同大小的正方形中,问题是:

1-如何找到小到大的小点?
2-关于如何对出现的事件进行排名,如下图所示?

这里是问题的简单演示和所需的解决方案:



更新1:
下图显示了正在研究的问题的更实际视图。


关于注释,以下属性适用:


点的精确位置可用
点的精确尺寸可用


尺寸可以为零(〜1)=仅一个点


所有点在白色背景上都是黑色的
没有灰度/抗锯齿效果

这是我的实现endolith提出的方法的一些小变化(我旋转了目标而不是源sinc e旋转更小,更快)。我接受了'endolith'的回答,因为我之前在考虑这个问题。关于RANSAC到目前为止,我还没有经验。此外,RANSAC的实现需要大量代码。


评论

您是否正在寻找一种解决方案,以匹配此类点,或更复杂的图片?图片中可以有多少个点?

是的,那很重要。如果只是已知大小的点,则可以对此进行优化。如果您可以控制基准标记,则可以对此进行优化。更详细地说明您将其用于什么。

对于我正在处理的问题,有一些点集(每个点数百个),其中正在寻找另一个较小的点集(例如<100)。上面的演示是如此简化和清晰,但是实际问题看起来很复杂。还有一种兴趣是根据其中存在的不良点来排名比赛。

会有黑白点吗?您是从相机/扫描仪/其他物品中获得它们吗?二进制值可以使计算更快。

您是否在寻找点的中心是否有问题,或者只是在知道点的位置的大图片中找到缩影?

#1 楼

这不是最好的解决方案,但这是一个解决方案。我想学习更好的技术:

如果不打算旋转或缩放它们,则可以使用图像的简单互相关。无论大图像中的小图像出现在哪里,都会有一个明亮的峰值。


使用归一化互相关注册图像
基于模板的匹配和卷积

您可以使用FFT方法加快互相关,但是如果您只是将一小幅源图像与一幅大目标图像进行匹配,则蛮力乘加法有时(通常不是)更快。


目标:



互相关:



两个亮点是相匹配的位置。

但是示例图像中确实有一个旋转参数,因此无法单独使用。如果仅允许旋转而不进行缩放,则仍然可以使用互相关,但是您需要进行互相关,旋转源,将其与整个目标图像进行互相关,再次对其进行旋转等。所有旋转。

请注意,这不一定会找到图像。如果源图像是随机噪声,而目标图像是随机噪声,则除非您以正确的角度搜索,否则您将找不到它。在正常情况下,它可能会找到它,但是它取决于图像的属性和搜索的角度。

此页面显示了如何完成此操作的示例,但没有给出

总和高于某个阈值的任何偏移量都是匹配项。您可以通过将源图像与其自身相关联并将所有总和除以该数字来计算匹配的优劣。完美匹配将是1.0。

这将在计算上非常繁琐,并且可能有更好的方法来匹配点的模式(我想知道)。

使用灰度和FFT方法的快速Python示例:虽然。互相关变为:


将源图像放置在目标图像上


按位求和所有重叠像素(比乘法快得多)
将重叠区域中的所有1求和所有1s


...

将灰度图像阈值化为二进制,然后执行此操作可能就足够了。 cloud

如果源和目标都是点的模式,则更快的方法是找到每个点的中心(与已知点互相关一次,然后找到峰)并存储它们作为一组点,然后通过旋转,平移并找到两组中最接近点之间的最小平方误差来匹配源与目标。

评论


$ \ begingroup $
是的,对于正在研究的问题,没有缩放比例,但可能发生旋转。感谢您的链接和答案。
$ \ endgroup $
–开发人员
2011-10-27 17:10

$ \ begingroup $
@Developer:好的,这将起作用,但是可能有更好的方法。如果只是二进制图像,则互相关会更快。 (是否有诸如FFT的二进制信号之类的东西?)旋转是否任意?您必须尝试一组旋转值,这些旋转值会产生良好的效果,例如增加1度或5度等。
$ \ endgroup $
– Endolith
2011-10-27 18:30



$ \ begingroup $
是的,这是一个二进制问题。我还从某个地方记得,曾经有一种方法可以找到在不同幅度的较长信号上调制的较短信号。我记得,无论复杂性如何,都可以很好地将选取点显示为事件的起点。由于问题是二维的,因此我不清楚如何使用类似的概念。由于应用于2D的旋转,这也很复杂。
$ \ endgroup $
–开发人员
2011年10月28日,0:45

$ \ begingroup $
是的,当增加旋转自由度时,这变得不可行。这就是为什么开发了像RANSAC这样的方法的原因。我认为这有助于在DSP盒之外进行思考。
$ \ endgroup $
– Matt M.
2011-10-28 1:37

$ \ begingroup $
@MattM .:有效,只是很慢。 :)
$ \ endgroup $
– Endolith
2011-10-28 2:09

#2 楼

从计算机视觉的角度来看:基本问题是估计目标点集与大集合中的点子集之间的单应性。就您而言,仅旋转,将是仿射单应性。您应该研究RANSAC方法。它旨在在具有多个异常值的集合中查找匹配项。因此,您拥有两个重要的关键字,单应性和RANSAC。

OpenCV提供了用于计算这些解决方案的工具,但是您也可以使用MATLAB。这是使用OpenCV的RANSAC示例。还有另一个完整的实现。

一个典型的应用程序可能是在图片中找到书的封面。您有书的封面图片和桌上的书图片。该方法不是执行模板匹配,而是在每个图像中找到显着的角,并比较这些点集。您的问题看起来像是此过程的后半部分-在大云中找到要点。 RANSAC旨在可靠地实现此目的。



我想互相关方法也可以为您工作,因为数据非常干净。问题是,旋转增加了另一个自由度,该方法变得非常慢。

评论


$ \ begingroup $
我在问题中添加了更多细节。我会仔细检查您的链接,但是很快就会发现它们是不同的概念!
$ \ endgroup $
–开发人员
2011-10-28 0:41

$ \ begingroup $
看起来这确实是一个RANSAC /单应性问题:)
$ \ endgroup $
– Matt M.
2011年10月28日在1:23

$ \ begingroup $
好。对我来说这是一个新概念。我会尽快尝试。如果我遇到困难,我将与您分享伟大的,支持社区的成员。
$ \ endgroup $
–开发人员
2011-10-28 3:04

$ \ begingroup $
简单的问题:将RANSAC /单应性方法应用于3D点云是否可行/可行?
$ \ endgroup $
–开发人员
11-10-29在10:51

$ \ begingroup $
这不是有效的解决方案。不幸的是,该问题不包含强度信息,因此简单的描述符方案不起作用。问题远不止于此。
$ \ endgroup $
–托尔加·伯达勒(Tolga Birdal)
17年1月14日在12:55

#3 楼

如果模式是稀疏二进制,则可以执行坐标矢量而不是图像的简单协方差。在左上排序的子窗口中获取点的坐标,从所有坐标中得出一个向量,并与左上排序的模式点的坐标组成的向量计算协方差。您也可以使用权重。之后,使用蛮力,最近邻居在大窗口中的某个网格(以及旋转角度的网格)上搜索最大协方差。在通过搜索找到近似坐标后,您可以使用加权最小二乘法对其进行优化。

PS
想法是,可以使用非零像素坐标来代替图像处理。常见的最近邻居搜索。您应该使用某个网格对所有搜索空间(包括平移和旋转)进行详尽搜索,这就是坐标和旋转角度的某个步骤。对于每个坐标/角度,您将窗口中的像素子集取为中心,并将该坐标旋转到该角度,取其坐标(相对于中心),然后将其与所查找图案的像素坐标进行比较。您应该确保两个集合中的点以相同的方式排序。您找到具有最小差异(最大协方差)的坐标。经过粗略的匹配后,您可以使用一些优化方法找到精确的匹配。
抱歉,我无法比这更简单。

评论


$ \ begingroup $
您能否举一个例子,为您的想法做更多的解释?您当前的答案版本使我感到困惑。
$ \ endgroup $
–开发人员
2011年11月1日下午4:07

#4 楼

为什么没有人提到广义霍夫变换家族的方法,我感到非常惊讶。他们直接解决了这个特殊问题。

这是我建议的内容:


取模板并创建R表,索引模板的边缘。
我选择的边线如下:


标记匹配位置的位置。即使边缘减少到一个点,该方法仍然可以使用,因为该方法不需要图像强度。实际上,对于2D情况,它只是累加器中的一个附加尺寸。万一您想详细了解提高效率的细节,M。Ulrich在他的论文中解释了很多技巧。

#5 楼

这是几何哈希的良好应用。几何哈希维基百科页面