Opencv之模板匹配可视化

模板匹配

目录

  • 模板匹配
    • [1 概念函数理解](#1 概念函数理解)
      • [1.1 概念](#1.1 概念)
      • [1.2 步骤](#1.2 步骤)
      • [1.3 函数](#1.3 函数)
    • [2 实际测试](#2 实际测试)
      • [2.1 图片数据](#2.1 图片数据)
      • [2.2 代码测试](#2.2 代码测试)

1 概念函数理解


1.1 概念

模板匹配是一种在较大图像中寻找与给定模板图像最相似区域的技术。它是图像处理和计算机视觉中的一个基本任务,广泛应用于各种领域,如物体识别、图像检索和视频监控等。

1.2 步骤

  1. 选择模板:首先,确定您想在较大图像中查找的小图像区域(模板)。
  2. 滑动窗口:将模板图像在较大图像上滑动,从左到右,从上到下,确保模板图像覆盖大图像的每一个可能位置。
  3. 相似度度量 :在每个位置,计算模板图像与较大图像中对应区域的相似度。常用的相似度度量方法包括:
    • 绝对差值和(Sum of Absolute Differences, SAD)
    • 平方差和(Sum of Squared Differences, SSD)
    • 归一化互相关(Normalized Cross-Correlation, NCC)
    • 结构相似性指数(Structural Similarity Index, SSIM)
  4. 找到最佳匹配:相似度度量的结果产生一个分数,表示模板与较大图像中每个位置的匹配程度。最高分数的位置被认为是最佳匹配。
  5. 结果输出 :输出最佳匹配的位置,有时还包括匹配度量的分数。
    模板匹配的一个关键挑战是它对图像的缩放、旋转和光照变化比较敏感。为了提高匹配的鲁棒性,可能需要对模板或搜索图像进行预处理,如归一化、直方图均衡化或使用更复杂的特征匹配方法。

1.3 函数

cv2.matchTemplate(img,tem,method) 匹配,一般设置此三个参数,其他参数默认result=None, mask=None,返回值为得分

具体如下:

  1. img: 待搜索的图像,即大图像,可以是灰度图像或者彩色图像。
  2. templ : 搜索的模板,它必须不大于待搜索的图像,并且与img具有相同的类型(灰度或彩色)。
  3. 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: 归一化的相关系数的系数
  4. result : 匹配结果图像,它是一个浮点单通道图像,其大小取决于模板的大小。如果img的大小是(W x H),而templ的大小是(w x h),则result的大小将是((W-w+1) x (H-h+1))。
  5. mask : 可选参数,用于指定模板图像的掩码。当模板图像不完整或者您只对模板图像的某个部分感兴趣时,可以使用掩码。掩码必须是一个单通道与templ大小相同的图像。

2 实际测试


2.1 图片数据

2.2 代码测试

代码展示:

python 复制代码
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:
相关推荐
刘简爱学习几秒前
弱监督互斥多类脑肿瘤图像分割的类间可分离性损失
人工智能·深度学习·计算机视觉
AI英德西牛仔8 分钟前
AI复制的文字带星号
人工智能·ai·chatgpt·豆包·deepseek·ds随心转
卖报的大地主12 分钟前
扩散薛定谔桥(Diffusion Schrödinger Bridge)
人工智能
向成科技15 分钟前
当“超轻量AI”遇上“最强国产芯”
人工智能·物联网·ai·芯片·国产化·硬件·主板
远见阁20 分钟前
智能体是如何“思考”的:ReAct模式
人工智能·ai·ai智能体
movigo7_dou26 分钟前
双目立体匹配
数码相机·opencv·计算机视觉
L-影27 分钟前
为什么你的数据里藏着“隐形圈子”?聊聊AI中的聚类
人工智能·ai·数据挖掘·聚类
江瀚视野33 分钟前
小马智行Robotaxi营收增超1.2倍,小马的成绩单该咋看?
人工智能
Tony Bai33 分钟前
Rust 看了流泪,AI 看了沉默:扒开 Go 泛型最让你抓狂的“残疾”类型推断
开发语言·人工智能·后端·golang·rust
2301_7644413337 分钟前
AI动态编排革命:Skill与Dify工作流终极对决
人工智能·机器学习