这可以仅使用matchTemplate
函数来实现,但需要一些解决方法。
让我们分析默认指标(CV_TM_SQDIFF_NORMED
)。根据matchTemplate 文档
,默认指标如下所示
R(x, y) = sum (I(x+x', y+y') - T(x', y'))^2
哪里I
是图像矩阵,T
是模板,R
是结果矩阵。求和是在模板坐标上完成x'
的y'
,
W
因此,让我们通过插入与 具有相同维度的
权重矩阵来更改此指标T
。
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 中的代码。但想法很简单。
我希望这将有所帮助。