Opencv之模板匹配可视化
模板匹配
目录
- 模板匹配
- 1 概念函数理解
- 1.1 概念
- 1.2 步骤
- 1.3 函数
- 2 实际测试
- 2.1 图片数据
- 2.2 代码测试
1 概念函数理解
1.1 概念
模板匹配是一种在较大图像中寻找与给定模板图像最相似区域的技术。它是图像处理和计算机视觉中的一个基本任务,广泛应用于各种领域,如物体识别、图像检索和视频监控等。
1.2 步骤
- 选择模板:首先,确定您想在较大图像中查找的小图像区域(模板)。
- 滑动窗口:将模板图像在较大图像上滑动,从左到右,从上到下,确保模板图像覆盖大图像的每一个可能位置。
- 相似度度量:在每个位置,计算模板图像与较大图像中对应区域的相似度。常用的相似度度量方法包括:
- 绝对差值和(Sum of Absolute Differences, SAD)
- 平方差和(Sum of Squared Differences, SSD)
- 归一化互相关(Normalized Cross-Correlation, NCC)
- 结构相似性指数(Structural Similarity Index, SSIM)
- 找到最佳匹配:相似度度量的结果产生一个分数,表示模板与较大图像中每个位置的匹配程度。最高分数的位置被认为是最佳匹配。
- 结果输出:输出最佳匹配的位置,有时还包括匹配度量的分数。
模板匹配的一个关键挑战是它对图像的缩放、旋转和光照变化比较敏感。为了提高匹配的鲁棒性,可能需要对模板或搜索图像进行预处理,如归一化、直方图均衡化或使用更复杂的特征匹配方法。
1.3 函数
cv2.matchTemplate(img,tem,method) 匹配,一般设置此三个参数,其他参数默认result=None, mask=None,返回值为得分
具体如下:
- img: 待搜索的图像,即大图像,可以是灰度图像或者彩色图像。
- templ: 搜索的模板,它必须不大于待搜索的图像,并且与
img
具有相同的类型(灰度或彩色)。 - method: 用于比较模板和图像的匹配方法。以下是可用的方法:
- cv2.TM_SQDIFF: 平方差和(Sum of Squared Differences)
- cv2.TM_SQDIFF_NORMED: 归一化的平方差和
- cv2.TM_CCORR: 相关性系数
- cv2.TM_CCORR_NORMED: 归一化的相关性系数
- cv2.TM_CCOEFF: 相关系数的系数
- cv2.TM_CCOEFF_NORMED: 归一化的相关系数的系数
- result: 匹配结果图像,它是一个浮点单通道图像,其大小取决于模板的大小。如果
img
的大小是(W x H),而templ
的大小是(w x h),则result
的大小将是((W-w+1) x (H-h+1))。 - mask: 可选参数,用于指定模板图像的掩码。当模板图像不完整或者您只对模板图像的某个部分感兴趣时,可以使用掩码。掩码必须是一个单通道与
templ
大小相同的图像。
2 实际测试
2.1 图片数据
2.2 代码测试
代码展示:
import cv2
import numpy as np
img = cv2.imread('tu.jpg')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
tem = cv2.imread('jian.jpg',0)
tem_rot90 = np.rot90(tem,k=1)
tem_rot90_1 =np.rot90(tem,k=-1)
tem_list = [tem,tem_rot90,tem_rot90_1]
for i in tem_list:
h, w = i.shape[:2]
res = cv2.matchTemplate(img_gray, i, cv2.TM_CCOEFF_NORMED)
# 设置阈值
thr = 0.9
# 匹配结果得分大于阈值的坐标
loc = np.where(res>=thr)
# 根据坐标画出矩形轮廓
for pt in zip(*loc[::-1]):
cv2.rectangle(img,pt,(pt[0]+w,pt[1]+h),(255,0,0),1)
cv2.imshow('tem',tem)
cv2.waitKey(0)
cv2.imshow('res',img)
cv2.waitKey(0)
运行结果:
- 调试
res:
loc: