其实模板匹配在我看来就是基础版本的目标检测,做惯了深度学习方式的目标检测,猛地回头反而觉得模板匹配这种方法挺有意思的,今天正好得闲就想着来简单实践一下。
首先简单回顾一下什么是模板匹配:
什么是模板匹配?
你有一副原图像,还有一小块模板(很小的图像,有可能来源于原图像),通过模板找出原图中和模板相似的位置。
如何实现匹配?
原图(I):我们需要在上面找到和模板匹配的图像
模板(T):一小块图像,是我们需要在原图中找到和它相似的区域位置的图像
方法:一直用模板在原图上进行移动,从左到右,从上到下,每移动一个像素,便去在模板区域内计算 “一种度量(度量)”,然后将"度量"结果存到Mat 对象中,最大值(或者最小值,根据计算方法不同)的位置,就是原图中最佳的匹配位置
先来简单看下效果:

我们想在中间图片上面找到跟左侧目标图片最为相似的区域这样的问题件就可以使用目标匹配的方式来做,核心方法为:
match_template(template, target)
其中:
template表示目标图片
target表示目标图片
接下来就是绘图:
fig = plt.figure(figsize=(8, 3))
ax1 = plt.subplot(1, 3, 1)
ax2 = plt.subplot(1, 3, 2)
ax3 = plt.subplot(1, 3, 3, sharex=ax2, sharey=ax2)
ax1.imshow(coin, cmap=plt.cm.gray)
ax1.set_axis_off()
ax1.set_title('template')
ax2.imshow(image, cmap=plt.cm.gray)
ax2.set_axis_off()
ax2.set_title('image')
hcoin, wcoin = coin.shape
rect = plt.Rectangle((x, y), wcoin, hcoin, edgecolor='r', facecolor='none')
ax2.add_patch(rect)
ax3.imshow(result)
ax3.set_axis_off()
ax3.set_title('`match_template`\nresult')
用同样的方法我们也可以尝试一些更为复杂的例子,如下:
【模板图片】

【目标图片】

计算结果如下:

【模板图像】

【目标图像】

【计算效果】

试试更加复杂的水底图片。
【模板图像】

【目标图片】

【计算效果】

还是很不错的。