点模式识别


46

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

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

这是问题的简单演示和所需的解决方案: 在此处输入图片说明


更新1:
下图显示了所研究问题的更实际的视图。 在此处输入图片说明

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

  • 点的确切位置可用
  • 点的确切大小可用
    • 大小可以为零(〜1)=仅一个点
  • 所有点在白色背景上都是黑色的
  • 没有灰度/抗锯齿效果

这是我通过endolith一些小的更改实现的方法的实现(我旋转了目标而不是源,因为它更小且旋转更快)。我接受了'endolith'的回答,因为我之前在考虑这个问题。关于RANSAC到目前为止,我还没有经验。此外,RANSAC的实现需要大量代码。 在此处输入图片说明


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

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

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

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

查找点的中心是否有问题,或者只是知道全景图的位置而找到大图上的缩影?

Answers:


17

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

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

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

资源:

在此处输入图片说明

目标:

在此处输入图片说明

互相关:

在此处输入图片说明

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

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

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

此页面显示了如何完成此操作的示例,但未提供算法。

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

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

使用灰度和FFT方法的快速Python示例:

from __future__ import division
from pylab import *
import Image
import ImageOps

source_file = 'dots source.png'
target_file = 'dots target.png'

# Load file as grayscale with white dots
target = asarray(ImageOps.invert(Image.open(target_file).convert('L')))

close('all')
figure()
imshow(target)
gray()
show()

source_Image = ImageOps.invert(Image.open(source_file).convert('L'))

for angle in (0, 180):
    source = asarray(source_Image.rotate(angle, expand = True))
    best_match = max(fftconvolve(source[::-1,::-1], source).flat)

    # Cross-correlation using FFT
    d = fftconvolve(source[::-1,::-1], target, mode='same')

    figure()
    imshow(source)


    # This only finds a single peak.  Use something that finds multiple peaks instead:
    peak_x, peak_y = unravel_index(argmax(d),shape(d))

    figure()    
    plot(peak_y, peak_x,'ro')
    imshow(d)

    # Keep track of all these matches:
    print angle, peak_x, peak_y, d[peak_x,peak_y] / best_match

1色位图

但是,对于1色位图,这会快得多。互相关变为:

  • 将源图像放在目标图像上
  • 将源图像移动1个像素
    • 按位与所有重叠像素
    • 将所有1加起来
  • ...

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

点云

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


1
没错,对于正在研究的问题,没有缩放比例,但可能发生旋转。感谢您的链接和答案。
开发人员

@Developer:好吧,这将起作用,但是可能有更好的方法。如果只是二进制图像,则互相关会更快。(是否存在诸如FFT的二进制信号之类的东西?)旋转是否任意?你必须有一组旋转值给出了良好的效果试验,如1度,或5度,等等递增
endolith

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

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

@MattM .:它起作用,只是速度很慢。:)
endlith 2011年

22

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

OpenCV提供了用于计算这些解决方案的工具,但是您也可以使用MATLAB。这是使用OpenCVRANSAC示例。并完成另一个。

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

在此处输入图片说明

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


我在问题中添加了更多细节。我会仔细检查您的链接,但是很快就会发现它们是不同的概念!
开发人员

1
看起来确实确实是RANSAC /单应性问题:)
Matt M.

好。对我来说,这是一个新概念。我会尽快尝试。如果我遇到困难,我将与大家分享伟大的,支持社区的成员。
开发人员

简单的问题:是否可以/可行地将RANSAC /单应性方法应用于3D点云?
开发人员

这不是有效的解决方案。不幸的是,该问题不包含强度信息,因此简单的描述符方案不起作用。问题远不止于此。
Tolga Birdal

3

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

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


1
您能给我们一个例子,对您的想法做更多的解释吗?您当前的答案版本使我感到困惑。
开发人员

3

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

这是我的建议:

  1. 拿模板并创建R-table,为模板的边缘建立索引。我选择的边线如下:

在此处输入图片说明

  1. 使用广义霍夫变换的默认OpenCV实现可获取: 在此处输入图片说明

标记匹配位置的位置。即使边缘减少到单个点,该方法仍然可以使用,因为该方法不需要图像强度。

此外,对于Hough方案,处理旋转非常自然。实际上,对于2D情况,它只是累加器中的附加尺寸。万一您想详细了解提高效率的细节,M。Ulrich会在他的论文中解释很多技巧。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.