了解和评估模板匹配方法

问题描述 投票:2回答:1

OpenCV具有matchTemplate()函数,该函数通过在输出上滑动模板输入,并生成与匹配项对应的数组输出来进行操作。

我在哪里可以了解有关如何解释六个TemplateMatchModes的更多信息?

我已经阅读并实现了基于tutorial的代码,但是除了理解一个人寻找TM_SQDIFF的最小匹配结果和最大的余数之外,我不知道如何解释不同的方法,以及一个人会选择另一个的情况。

例如(摘自本教程)

res = cv.matchTemplate(img_gray, template, cv.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where(res >= threshold)

R(x,y)= ∑x′,y′ (T′(x′,y′) ⋅ I′(x+x′,y+y′))
        −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−-------------
       sqrt(∑x′,y′ T′(x′,y′)^2 ⋅ ∑x′,y′ I′(x+x′,y+y′)^2)

(来自文档页面;不确定如何进行方程式格式化)

[我推测TM_CCOEFF_NORMED将返回0到1之间的值,并且0.8阈值是任意的,但这只是假设。

是否有更深入的研究在线方程式,针对标准数据集的性能度量或有关不同模式以及何时以及为何使用一种和另一种模式的学术论文?

python opencv convolution template-matching
1个回答
3
投票

所有模板匹配模式可以粗略地分类为密集的(在像素上是指像素)相似性度量,或者等效地但相反地,将图像之间的距离度量分类。

通常,您将有两张图像,并且想要以某种方式进行比较。模板匹配并不能直接帮助您匹配缩放,旋转或扭曲的对象。模板匹配严格涉及精确测量两个图像的相似度。但是,这里使用的实际度量标准在计算机视觉中得到了广泛使用,包括查找图像之间的转换...只是通常还会进行更复杂的步骤(例如,通过梯度下降来找到最佳的转换参数)。

距离度量有很多选择,根据应用的不同,它们通常会有优缺点。


绝对差之和(SAD)

首先,最基本的距离度量只是两个值之间的绝对差,即d(x, y) = abs(x - y)。对于图像,将其从单个值扩展的简单方法是将所有这些距离相加,以像素为单位,从而得出绝对差之和(SAD)度量;它也被称为Manhattantaxicab distance,并定义L1 norm。这与获得距离度量标准一样简单。令人讨厌的是,这并不是作为OpenCV的模板匹配模式之一实现的,但这并不重要。在此讨论中,与SSD进行比较仍然很重要。

在模板匹配方案中,您可以将模板沿着多个位置滑动,只需找出差异最小的位置。这等效于询问数组[1,4,9]中最接近5的索引是什么。您将数组中每个值的绝对差取为5,而索引1的差最小,因此这是最接近的匹配项的位置。当然,在模板匹配中,值不是5,而是一个数组,图像是一个更大的数组。

平方差之和(SSD):TM_SQDIFF

SAD指标的一个有趣特征是,它不会惩罚真正的大差异,而不会惩罚一堆非常小的差异。假设我们要使用以下向量计算d(a, b)d(a, c)

a = [1, 2, 3]
b = [4, 5, 6]
c = [1, 2, 12]

[逐个取绝对差之和]

SAD(a, b) = 3 + 3 + 3 = 9 = 0 + 0 + 9 = SAD(a, c)

在某些应用中,也许没关系。但是在其他应用程序中,您可能希望这两个距离实际上有很大的不同。对差异进行平方处理,而不是取其绝对值,会对与您期望的值相距更远的值进行惩罚-随着值的差异增大,图像会变得越来越远。它将更多地映射到某人可能如何将估算值解释为偏离[[way,即使其值实际上并不遥远。平方差之和(SSD)等于平方的欧几里得距离,即L2范数的距离函数。使用SSD时,我们看到两个距离现在大不相同:SSD(a, b) = 3^2 + 3^2 + 3^2 = 27 != 81 = 0^2 + 0^2 + 9^2 = SSD(a, c) 您可能会看到L1规范

有时被称为“健壮”规范。这是因为单点错误不会比错误本身扩大距离。但是,当然,对于SSD,离群值会使距离更大。因此,如果您的数据容易出现一些非常遥远的值,请注意,SSD可能不是一个好的相似度指标。一个很好的例子可能是比较曝光过度的图像。在图像的某些部分,您可能只有白色的天空,而其他的根本不是白色的,因此图像之间的距离会很大。
当比较的两个图像相同时,SAD和SSD的最小距离均为0。它们都总是非负的,因为绝对差或平方差总是非负的。

互相关(CC):TM_CCORR

SAD和SSD都是通常离散的指标-因此,它们是采样信号(例如图像)的自然考虑因素。然而,互相关也适用于连续信号,因此也适用于模拟信号,这是信号处理中普遍存在的一部分。对于广泛的信号,尝试检测信号中是否存在模板被称为

matched filter

,您基本上可以将其视为模板匹配的连续模拟。

交叉相关性只是将两个图像相乘在一起。您可以想象,如果两个信号精确对齐,将它们相乘将简单地将模板平方。如果它们不是按原样排列的,那么产品将较小。因此,最大化产品的位置就是他们排列最佳产品的位置。但是,当您将互相关用作不确定的信号的相似性度量时,互相关会出现问题,通常在以下示例中显示。假设您有三个数组:

a = [2, 600, 12] b = [v, v, v] c = [2v, 2v, 2v]

[广泛地,ab之间以及ac之间没有明显的相关性。通常,ab的关联不应超过与c的关联。但是,它是一种产品,因此是ccorr(a, c) = 2*ccorr(a, b)。因此,这对于尝试在较大图像中查找模板并不理想。而且由于我们要处理具有定义的最大值(图像)的离散数字信号,所以这意味着图像的亮白色斑块基本上总是具有最大的相关性。由于这个问题,TM_CCORR作为模板匹配方法不是特别有用。

均值移位互相关(皮尔森相关系数):TM_CCOEFF

解决与明亮色块相关的问题的一种简单方法是在比较信号之前简单地减去均值。这样,简单移位的信号与未移位的信号具有相同的相关性。凭我们的直觉,这是有道理的-在一起变化的信号相互关联。 

标准化:TM_SQDIFF_NORMEDTM_CCORR_NORMEDTM_CCOEFF_NORMED

OpenCV中的所有方法均被标准化。归一化的点是

not

,以提供置信度/概率,但要提供一个指标,您可以将其与不同大小的模板或具有不同比例值的模板进行比较。例如,假设我们要查找对象是否在图像中,并且该对象有两个不同的模板。两种不同的模板大小不同。我们可以通过像素数进行归一化,这将比较不同大小的模板。但是,说我的模板实际上在强度上有很大不同,就像一个模板的像素值方差比另一个模板大得多。通常,在这种情况下,您要做的就是除以标准偏差(与均值平方差之和的平方根)。除非您使用相关系数方法,否则OpenCV不会进行均值平移,因此它并不完全是标准偏差,但是想法是相同的。

其他指标

OpenCV没有提供其他有用的指标。 Matlab提供了SAD以及最大绝对差度量(MaxAD),该度量也称为uniform distance

度量,并给出了[[L∞范数]]。基本上,您采用最大绝对差而不是它们的总和。您使用的其他指标是在优化设置中看到的指标,例如OpenCV中其他区域中未使用的enhanced correlation coefficient模板匹配,例如computeECC()computeECC()

使用哪种方法?[通常,您会看到标准化和未标准化的SSD(findTransformECC()findTransformECC()),以及使用零归一化互相关/ ZNCC(TM_SQDIFF_NORMED)。有时您可能会看到TM_SQDIFF,但是却很少见。根据我在网上发现的一些TM_CCOEFF_NORMED(关于该主题的一些不错的例子和直觉!),Trucco和Verri的CV书指出,一般而言SSD比关联性要好,但是我没有T&V的书来了解为什么他们建议这样做;大概是在真实照片上进行比较。但是尽管如此,SAD和SSD绝对有用,特别是在数字图像上。我不知道任何一种在大多数情况下或某些情况下本质上都更好的示例,我认为这确实取决于您的图像和模板。通常,我会说:如果您正在寻找完全匹配或非常接近完全匹配的内容,请使用SSD。它的速度很快,而且绝对可以映射到您要最小化的内容(模板和图像补丁之间的差异)。在这种情况下,无需进行标准化,这只是增加了开销。如果您有类似的要求,但需要多个模板才能比较,则请标准化SSD。如果您正在寻找匹配项,但是您正在处理可能存在曝光或对比度差异的真实照片,则ZNCC的均值漂移和方差均衡可能是最好的。


关于选择正确的阈值,ZNCC或SSD的值根本不是置信度或概率数。如果要选择正确的阈值,则可以采用多种典型方法来测量参数。您可以计算不同阈值的ROC曲线或PR曲线。您可以使用回归来找到最佳参数。您需要标记一些数据,但至少要对一些测试集进行度量,以确保您的选择不是任意的。像往常一样,在充满数据的字段中,您需要确保数据尽可能接近真实示例,并且测试数据涵盖了边缘情况以及典型图像。
© www.soinside.com 2019 - 2024. All rights reserved.