目录
一、模版匹配的核心概念
1.图片模板匹配是一种用于在图像中查找特定模式或对象的技术。
2.模板图像
3.目标图像
4.滑动窗口
5.相似度度量
6.匹配位置
二、模版匹配的步骤
1.准备图像:
2.预处理:
3.匹配:
4.定位最佳匹配:
5.标记结果:
6.显示或处理结果:
三、代码实现
一、模版匹配的核心概念
1.图片模板匹配是一种用于在图像中查找特定模式或对象的技术。
2.模板图像
- 这是你要在目标图像中找到的部分。模板图像通常比目标图像小,并且包含你感兴趣的特征。
3.目标图像
- 这是包含模板图像的图像。在目标图像中,你希望找到与模板图像匹配的区域。
4.滑动窗口
- 模板图像像一个窗口一样在目标图像上滑动。这种滑动可以是从左到右,从上到下,或以其他方式覆盖整个目标图像。
5.相似度度量
在每个窗口位置,计算模板图像与目标图像窗口区域的相似度。常见的相似度度量包括:
- 归一化互相关(NCC):衡量两个图像块之间的相似度,通过比较像素值的相关性。
- 均方误差(MSE):计算模板图像与目标图像窗口区域之间的像素差异的平方和。
- 结构相似性(SSIM):评估图像的亮度、对比度和结构相似度。
6.匹配位置
- 通过比较相似度度量的结果,确定模板图像在目标图像中最佳的匹配位置。通常,最大或最小的相似度值指示了最佳匹配。
二、模版匹配的步骤
1.准备图像:
- 目标图像:这是你希望在其中查找模板图像的图像。
- 模板图像:这是你要在目标图像中查找的图像片段或图案。
2.预处理:
- 灰度化(可选):将目标图像和模板图像转换为灰度图像,以简化计算和提高效率(对于一些匹配方法,灰度化是可选的)。
3.匹配:
- 使用匹配算法计算模板图像与目标图像不同位置之间的相似度。这些算法会生成一个相似度矩阵,矩阵中的每个值表示模板图像在目标图像某个位置的匹配度。
4.定位最佳匹配:
- 从相似度矩阵中找出最佳匹配的位置。通常,这会是矩阵中的最大值(表示最相似的区域)。
5.标记结果:
- 在目标图像上标记出匹配区域,通常是通过绘制一个矩形框来突出显示找到的模板图像的位置。
6.显示或处理结果:
- 显示带有匹配标记的目标图像,或将结果保存以供后续处理。
三、代码实现
- 完整代码 以及函数参数介绍
- 使用的是cv2.matchTemplate()方法
"""模版匹配"""
# cv2.matchTemplate(image, templ, method, result=None, mask=None)
# image:待搜索图像
# templ:模板图像
# method:计算匹配程度的方法,可以有:
# TM_SQDIFF 平方差匹配法:该方法采用平方差来进行匹配;匹配越好,值越小;匹配越差,值越大。
# TM_CCORR 相关匹配法:该方法采用乘法作;数值越大表明匹配程度越好。
# TM_CCOEFF 相关系数匹配法:数值越大表明匹配程度越好。
# TM_SQDIFF_NORMED 归一化平方差匹配法,匹配越好,值越小;匹配越差,值越大。
# TM_CCORR_NORMED 归一化相关匹配法,数值越大表明匹配程度越好。
# TM_CCOEFF_NORMED 归一化相关系数匹配法,数值越大表明匹配程度越好。
import cv2
kele = cv2.imread('baishi.jpg')
moban = cv2.imread('baishikele.png')
cv2.imshow('baishi', kele)
cv2.imshow('moban', moban)
cv2.waitKey(0)
h, w = moban.shape[:2] # 获取模版图片的高宽
res = cv2.matchTemplate(kele, moban, cv2.TM_CCOEFF_NORMED) # 返回一个矩阵,其中每个元素表示该位置与模板的匹配程度
# cv2.minMaxLoc可以获取矩阵中的最小值和最大值,以及最小值的索引号和最大值的索引号
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 最小值、最大值、最小值位置、最大值位置
top_left = max_loc # 最大值为匹配到的模板的左上角
bottom_right = (top_left[0] + w, top_left[1] + h) # 主图片中用模版匹配到的位置
kele_template = cv2.rectangle(kele, top_left, bottom_right, (0, 0, 255), thickness=3)
cv2.imshow('kele_template', kele_template)
cv2.waitKey(0)
输出:
也可以自己找图片进行截图尝试模版匹配