这可以仅使用
matchTemplate
函数来实现,但需要进行一些小的变通。
让我们分析默认指标(
CV_TM_SQDIFF_NORMED
)。根据
matchTemplate文档,默认指标如下:
R(x, y) = sum (I(x+x', y+y') - T(x', y'))^2
其中
I
是图像矩阵,
T
是模板,
R
是结果矩阵。求和是在模板坐标
x'
和
y'
上进行的。
因此,让我们通过插入具有与
T
相同尺寸的权重矩阵
W
来改变这个指标。
Q(x, y) = sum W(x', y')*(I(x+x', y+y') - T(x', y'))^2
在这种情况下,通过设置
W(x', y') = 0
,您可以忽略像素。那么如何制作这样的指标呢?通过简单的数学:
Q(x, y) = sum W(x', y')*(I(x+x', y+y') - T(x', y'))^2
= sum W(x', y')*(I(x+x', y+y')^2 - 2*I(x+x', y+y')*T(x', y') + T(x', y')^2)
= sum {W(x', y')*I(x+x', y+y')^2} - sum{W(x', y')*2*I(x+x', y+y')*T(x', y')} + sum{W(x', y')*T(x', y')^2)}
因此,我们将
Q
指标分成三个单独的总和。 所有这些总和都可以使用
matchTemplate
函数进行计算(使用
CV_TM_CCORR
方法)。 即
sum {W(x', y')*I(x+x', y+y')^2} = matchTemplate(I^2, W, method=2)
sum{W(x', y')*2*I(x+x', y+y')*T(x', y')} = matchTemplate(I, 2*W*T, method=2)
sum{W(x', y')*T(x', y')^2)} = matchTemplate(T^2, W, method=2) = sum(W*T^2)
最后一个元素是常数,所以在最小化中它没有任何影响。另一方面,如果 Q 趋近于零,检查我们的模板是否完美匹配仍然可能有用。尽管如此,对于最后一个元素,我们实际上不需要使用
matchTemplate
函数,因为它可以直接计算。
最终伪代码如下:
result = matchTemplate(I^2, W, method=2) - matchTemplate(I, 2*W*T, method=2) + as.scalar(sum(W*T^2))
它是否真正按照定义执行?从数学上来说是的。实际上,由于matchTemplate函数是基于32位浮点数运算的,所以存在一些小的舍入误差,但我相信这不是一个大问题。
请注意,您可以扩展分析并为matchTemplate提供的任何指标设置加权等价物。
这对我实际上起作用了。很抱歉我没有提供实际代码。我正在使用R进行工作,因此我没有Python代码。但是,这个想法非常简单。
希望这可以帮助到你。