了解和评估模板匹配方法

Posted

技术标签:

【中文标题】了解和评估模板匹配方法【英文标题】:Understanding and evaluating template matching methods 【发布时间】:2019-09-29 18:37:20 【问题描述】:

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 阈值是任意的,但这只是假设。

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

【问题讨论】:

另外,这些问题是相关的,但不完全涵盖以上内容:***.com/questions/28506665/…***.com/questions/49464639/… 次要问题:CCOEFF_NORMED 结果在 [-1, 1] 而不是 [0, 1] 中。 CCOEFF 是均值偏移,所以均值为 0,所以值有正有负,然后相乘再除...所以结果也可以为负。 【参考方案1】:

所有的模板匹配模式都可以粗略地分类为密集(意思是逐像素)相似度度量,或者等效但相反地分类为图像之间的距离度量

通常,您将拥有两张图片,并且您希望以某种方式比较它们。事实上,模板匹配并不能直接帮助您匹配缩放、旋转或扭曲的事物。模板匹配严格地关注测量两个图像的相似性,就像它们出现时一样。但是,此处使用的实际指标在计算机视觉中无处不在,包括查找图像之间的转换……只是通常还会执行更复杂的步骤(例如梯度下降以找到最佳转换参数)。

距离指标有很多选择,根据应用程序的不同,它们通常各有利弊。


绝对差之和 (SAD)

首先,最基本的距离度量只是两个值之间的绝对差,即d(x, y) = abs(x - y)。对于图像,从单个值扩展它的一种简单方法是将所有这些距离按像素求和,从而得出绝对差之和 (SAD) 度量;它也称为曼哈顿出租车距离,定义了L1范数。烦人的是,这并没有作为 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)

在某些应用程序中,这可能无关紧要。但在其他应用中,您可能希望这两个距离实际上完全不同。对差异进行平方而不是取它们的绝对值,而是惩罚与您期望的值更远的值 - 随着值差异的增加,它会使图像远离。它更多地映射到某人可能如何将估计解释为偏离,即使在价值上它实际上并没有那么遥远。平方差之和 (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 通常都是离散的指标——因此它们是采样信号(如图像)的自然考虑因素。然而,互相关也适用于连续信号,因此也适用于模拟信号,这是其在信号处理中普遍存在的一部分。从广义上讲,尝试检测信号中是否存在模板被称为匹配过滤器,您基本上可以将其视为模板匹配的连续模拟。

互相关只是将两个图像相乘。您可以想象,如果两个信号完全对齐,则将它们相乘只会使模板平方。如果它们没有排列整齐,那么产品会更小。因此,产品最大化的位置是它们排列最好的位置。但是,当您将互相关用作您不确定是否相关的信号的相似性度量时,互相关就会出现问题,这通常在以下示例中显示。假设你有三个数组:

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

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

均值偏移互相关(皮尔逊相关系数):TM_CCOEFF

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

标准化:TM_SQDIFF_NORMEDTM_CCORR_NORMEDTM_CCOEFF_NORMED

OpenCV 中的所有方法都进行了相同的标准化。规范化的点不是给出置信度/概率,而是给出一个可以与不同大小的模板或不同比例的值进行比较的度量。例如,假设我们要查找一个对象是否在图像中,并且我们有该对象的两个不同模板。两个不同的模板大小不同。我们可以通过像素数进行归一化,这样可以比较不同大小的模板。但是,假设我的模板实际上在强度上完全不同,就像一个模板的像素值方差比另一个模板高得多。通常,在这种情况下您要做的就是除以标准差(与平均值的平方差之和的平方根)。 OpenCV 确实使用TM_CCOEFF_NORMED 方法来做到这一点,因为均值差的平方和方差,但其他方法不是均值偏移,因此缩放只是对总和的度量图像值。无论哪种方式,结果都是相似的,您希望根据所用图像块的强度进行缩放。

其他指标

OpenCV 没有提供其他有用的指标。 Matlab提供了SAD,以及最大绝对差度量(MaxAD),也称为均匀距离度量,给出了L∞范数。基本上,您采用最大绝对差而不是它们的总和。使用的其他指标通常在优化设置中看到,例如enhanced correlation coefficient,它最初是为立体匹配提出的,然后通常被扩展用于对齐。该方法在 OpenCV 中使用,但不适用于模板匹配;您可以在 computeECC()findTransformECC() 中找到 ECC 指标。


使用哪种方法?

大多数情况下,您会看到使用规范和非规范 SSD(TM_SQDIFF_NORMEDTM_SQDIFF)和零规范化互相关/ZNCC(TM_CCOEFF_NORMED)。有时您可能会看到TM_CCORR_NORMED,但不太常见。根据我在网上找到的一些lecture notes (关于这个主题的一些很好的例子和直觉!),Trucco 和 Verri 的 CV 书指出,通常 SSD 比相关性更好,但我没有 T&V 的书来了解他们为什么建议;大概是在现实世界的照片上进行比较。但尽管如此,SAD 和 SSD 绝对有用,尤其是在数字图像方面。

我不知道有任何明确的例子表明在大多数情况下其中一个或另一个本质上更好或其他什么——我认为这真的取决于你的图像和模板。一般来说,我会说:如果您正在寻找精确匹配或非常接近精确匹配,请使用 SSD。它速度很快,而且它肯定会映射到您要最小化的内容(模板和图像补丁之间的差异)。在这种情况下不需要标准化,它只是增加了开销。如果您有类似的要求,但需要多个模板进行比较,则对 SSD 进行规范化。如果您正在寻找匹配项,但您正在处理可能存在曝光或对比度差异的真实照片,那么来自 ZNCC 的均值偏移和方差均衡可能是最好的。

至于选择正确的阈值,来自 ZNCC 或 SSD 的值根本不是置信度或概率数。如果您想选择正确的阈值,您可以通过多种典型方式测量参数。您可以计算不同阈值的 ROC 曲线或 PR 曲线。您可以使用回归来找到最佳参数。您需要标记一些数据,但至少您将对某些测试集的表现进行测量,这样您的选择就不是任意的。像往常一样使用数据填充字段,您需要确保您的数据尽可能接近真实世界的示例,并且您的测试数据涵盖您的边缘案例以及典型图像。

【讨论】:

谢谢。非常周到的概述! 我想知道你是否可以为我澄清一些事情。当您谈论规范化时,您会提到同一对象的两个不同模板。但是,在我的项目中,我正在为多个对象搜索单个图像,实际上预计只有一个对象存在。 TM_CCOEFF_NORMED 会为此工作吗? IE。 存在的对象的模板是否会可靠地生成比丢失对象更高的输出,无论它们的大小或强度如何? @Jordak 确实同样适用于那里;您肯定会希望对该任务使用规范化。我将从TM_CCOEFF_NORMEDTM_CCORR_NORMED 开始——根据图像输入,可能需要也可能不需要使用相关系数进行移位(例如,如果您希望模板和对象之间的强度相等)图像,那么您只需要互相关;如果您需要对不同的光照具有鲁棒性,则使用相关系数。 您表示“但是,假设我的模板在强度上实际上有很大不同,就像一个模板的像素值方差比另一个高得多。通常,在这种情况下你要做的就是划分由标准偏差(与平均值的平方差之和的平方根)”。然而,实际上互相关公式并没有从平方和中减去平均值。你能解释一下为什么吗? @Freeman 互相关更常用于当您有两个在其他方面相同但只是彼此偏移的信号/图像时。在这种情况下,归一化或均值移动不是特别需要。然而,在尝试建立两个信号之间的线性关系时,Pearson 相关系数(这是 TM_CCOEFF_NORMED 计算的)给出了两个信号之间依赖关系的更有意义的分数。

以上是关于了解和评估模板匹配方法的主要内容,如果未能解决你的问题,请参考以下文章

身份牌识别基于matlab GUI模板匹配身份牌识别含Matlab源码 1354期

身份牌识别基于matlab GUI模板匹配身份牌识别含Matlab源码 1354期

交通标志识别基于模板匹配算法实现交通标志识别matlab源码

交通标志识别基于模板匹配算法实现交通标志识别matlab源码

交通标志识别基于matlab GUI模板匹配交通标志识别含Matlab源码 1059期

手写字母识别基于matlab GUI模板匹配手写大写字母(A-J)识别含Matlab源码 1107期