Python+Opencv实现模板匹配

article/2025/11/9 18:40:05

目录

    • 一、模板匹配简介
    • 二、传统模板匹配算法不足之处
    • 三、多尺度模板匹配实现步骤
    • 四、多尺度模板匹配实现代码
    • 五、多尺度模板匹配效果展示和分析
    • 六、思维扩展
    • 参考资料
    • 注意事项

一、模板匹配简介

  所谓的模板匹配,即在给定的图片中查找和模板最相似的区域,该算法的输入包括模板和测试图片,整个任务的思路就是按照滑窗的思路不断的移动模板图片,计算其与图像中对应区域的匹配度,最终将匹配度最高的区域选择为最终的结果。下图展示了一个样例,左边是对应的模板,右边是在测试图片中检测的结果。
在这里插入图片描述

二、传统模板匹配算法不足之处

  Opencv中集成了一个模板匹配算法,用户调用cv2.matchtemplate函数就可以实现该功能。下面展示了一个该函数的使用样例,该样例的模板是一枚硬币,cv2.matchtemplate函数可以准确的在测试图片中检测到所有的硬币。

import cv2
import numpy as np
from matplotlib import pyplot as pltimg_rgb = cv2.imread('mario.png')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('mario_coin.png',0)
w, h = template.shape[::-1]res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where( res >= threshold)
for pt in zip(*loc[::-1]):cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)cv2.imwrite('res.png',img_rgb)

在这里插入图片描述
  下图展示了另外一个案例,匹配的模板如左图所示,匹配的结果如右图所示,通过观察该图我们可以发现cv2.matchtemplate函数并没有输出准确的结果,它仅仅输出了一部分区域,主要的原因是因为模板的大小和测试图片中的目标的大小之间存在着较大的差异,而使用滑窗思路在测试图片中只能获得对应大小的一块区域,本文的重点就是针对这个问题提出一个多尺度的模板匹配算法。
在这里插入图片描述

三、多尺度模板匹配实现步骤

  • 步骤1-读取模板图片,并依次执行灰度化和边缘检测处理;
  • 步骤2-读取测试图片,遍历整个尺度空间,进行图片裁剪;
  • 步骤3-依次执行边缘检测和模板匹配,获取到外接矩形;
  • 步骤4-根据结果对测试图片中模板所在的位置进行更新;
  • 步骤5-首先进行位置转换,然后绘制矩形框,最后显示结果。

四、多尺度模板匹配实现代码

# coding=utf-8
# 导入python包
import numpy as np
import argparse
import imutils
import glob
import cv2# 构建并解析参数
ap = argparse.ArgumentParser()
ap.add_argument("-t", "--template", required=True, help="Path to template image")
ap.add_argument("-i", "--images", required=True, help="Path to images where template will be matched")
ap.add_argument("-v", "--visualize", help="Flag indicating whether or not to visualize each iteration")
args = vars(ap.parse_args())# 读取模板图片
template = cv2.imread(args["template"])
# 转换为灰度图片
template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
# 执行边缘检测
template = cv2.Canny(template, 50, 200)
(tH, tW) = template.shape[:2]
# 显示模板
cv2.imshow("Template", template)# 遍历所有的图片寻找模板
for imagePath in glob.glob(args["images"] + "/*.jpg"):# 读取测试图片并将其转化为灰度图片image = cv2.imread(imagePath)gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)found = None# 循环遍历不同的尺度for scale in np.linspace(0.2, 1.0, 20)[::-1]:# 根据尺度大小对输入图片进行裁剪resized = imutils.resize(gray, width = int(gray.shape[1] * scale))r = gray.shape[1] / float(resized.shape[1])# 如果裁剪之后的图片小于模板的大小直接退出if resized.shape[0] < tH or resized.shape[1] < tW:break# 首先进行边缘检测,然后执行模板检测,接着获取最小外接矩形edged = cv2.Canny(resized, 50, 200)result = cv2.matchTemplate(edged, template, cv2.TM_CCOEFF)(_, maxVal, _, maxLoc) = cv2.minMaxLoc(result)# 结果可视化if args.get("visualize", False):# 绘制矩形框并显示结果clone = np.dstack([edged, edged, edged])cv2.rectangle(clone, (maxLoc[0], maxLoc[1]), (maxLoc[0] + tW, maxLoc[1] + tH), (0, 0, 255), 2)cv2.imshow("Visualize", clone)cv2.waitKey(0)# 如果发现一个新的关联值则进行更新if found is None or maxVal > found[0]:found = (maxVal, maxLoc, r)# 计算测试图片中模板所在的具体位置,即左上角和右下角的坐标值,并乘上对应的裁剪因子(_, maxLoc, r) = found(startX, startY) = (int(maxLoc[0] * r), int(maxLoc[1] * r))(endX, endY) = (int((maxLoc[0] + tW) * r), int((maxLoc[1] + tH) * r))# 绘制并显示结果cv2.rectangle(image, (startX, startY), (endX, endY), (0, 0, 255), 2)cv2.imshow("Image", image)cv2.waitKey(0)

注:运行方法:python xxx.py -t 模板.jpg -i 测试图片.jpg(其中xxx,模板,测试图片需要根据你的情况进行适当的调整哈。)

五、多尺度模板匹配效果展示和分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  上图展示了改进后的多尺度模板匹配算法的效果。我们可以发现改进后的算法可以准确的在测试图片中检测出和模板大小不相同的区域,和改进之前的效果相比,具有很大的性能提升。尺度问题是现实生活中经常会遇到的一个问题,因而解决这个问题具有重要的研究意义。下面对整个多尺度处理的过程进行展示和分析。
在这里插入图片描述
  上图展示了改进后的多尺度模板匹配的过程,即通过在不同的尺度中进行模板的匹配,最终从多个尺度中选择匹配度最高的结果进行输出即可。

六、思维扩展

  尽管改进后的多尺度模板匹配算法可以很好的解决尺度问题,但是该算法对物体旋转和非仿射性变换的匹配效果并不鲁棒,聪明的你肯定想到了一个解决方案,那就是使用关键点匹配法,比较经典的关键点检测算法包括SIFT和SURF等,主要的思路是首先通过关键点检测算法获取模板和测试图片中的关键点;然后使用关键点匹配算法处理即可,这些关键点可以很好的处理尺度变化、视角变换、旋转变化、光照变化等,具有很好的不变性。

参考资料

[1] 参考链接1
[2] 参考链接2

注意事项

[1] 如果您对AI、自动驾驶、AR、ChatGPT等技术感兴趣,欢迎关注我的微信公众号“AI产品汇”,有问题可以在公众号中私聊我!
[2] 该博客是本人原创博客,如果您对该博客感兴趣,想要转载该博客,请与我联系(qq邮箱:1575262785@qq.com),我会在第一时间回复大家,谢谢大家的关注.
[3] 由于个人能力有限,该博客可能存在很多的问题,希望大家能够提出改进意见。
[4] 如果您在阅读本博客时遇到不理解的地方,希望您可以联系我,我会及时的回复您,和您交流想法和意见,谢谢。
[5] 本文测试的图片可以通过关注公众号AI产品汇之后找我索取!
[6] 本人业余时间承接各种本科毕设设计和各种小项目,包括图像处理(数据挖掘、机器学习、深度学习等)、matlab仿真、python算法及仿真等,有需要的请加QQ:1575262785详聊!!!


http://chatgpt.dhexx.cn/article/VNp1VYTO.shtml

相关文章

OpenCV数字图像处理实战二:模板匹配(C++)

OpenCV数字图像处理实战二&#xff1a;模板匹配&#xff08;C&#xff09; 1、模板匹配原理 模板匹配&#xff08;TemplateMatching&#xff09;就是在一幅图像中寻找和模板图像&#xff08;template&#xff09;最相似的区域&#xff0c;模板匹配不是基于直方图的&#xff0…

opencv 模板匹配形状匹配

文章目录 1. 找圆垫子1.1 得到模板1.2 形状匹配 2. 找瓜子 这是第四次作业要求 所以今天就趁机会讲讲模板匹配&#xff0c;正好之前的项目有一部分重要工作就是和模板匹配紧密相关&#xff0c;对于今天作业来说&#xff0c;之前的项目难度更大&#xff0c;因为涉及到许多要考虑…

Opencv——图像模板匹配

引言 什么是模板匹配呢&#xff1f; 看到这里大家是否会觉得很熟悉的感觉涌上心头&#xff01;在人脸识别是不是也会看见 等等。 模板匹配可以看作是对象检测的一种非常基本的形式。使用模板匹配&#xff0c;我们可以使用包含要检测对象的“模板”来检测输入图像中的对象。 …

OpenCV-模板匹配cv::matchTemplate

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 函数原型 void matchTemplate( InputArray image, InputArray templ,OutputArray result, int method, InputArray mask noArr…

OPENCV多种模板匹配使用对比

前文简单提到模板匹配中的一种&#xff1a;NCC多角度模板匹配&#xff0c;博主结合实际的检测项目&#xff08;已落地&#xff09;发现其准确率和稳定性有待提升&#xff0c;特别是一些复杂背景的图形&#xff0c;又或是模板选取不当都会造成不理想的效果&#xff1b;同时也借鉴…

基于opencv的模板匹配详解

1.什么是模板匹配 在OpenCV教程中这样解释模板匹配&#xff1a; 模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术。这里说的模板是我们已知的小图像&#xff0c;模板匹配就是在一副大图像中搜寻目标。模板就是我们已知的在图中要找的目标&#xff0c;…

OpenCV模板匹配(cv2.matchTemplate)

目录 摘要正文OpenCV模板匹配&#xff08;cv2.matchTemplate&#xff09;什么是模板匹配&#xff1f;OpenCV的 “cv2.matchTemplate” 函数配置开发环境项目结构使用OpenCV实施模板匹配OpenCV模板匹配结果总结 摘要 在本教程中&#xff0c;您将学习如何使用OpenCV和cv2.matchTe…

Opencv (C++)系列学习---模板匹配

目录 1.模板匹配的定义 2.API介绍 3.寻找最优匹配位置&#xff08;匹配后的配套操作&#xff09; 4.具体代码 1.模板匹配的定义 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域&#xff0c;该匹配方法并不是基于直方图&#xff0c;而是使用一个图像块在输入图像…

【OpenCV--模板匹配】

目录 一、模板匹配 1.定义&#xff1a; 2.实现&#xff1a; 二、霍夫线检测 1.原理&#xff1a; 2.实现&#xff1a; 三、霍夫圆检测 1.描述&#xff1a; 2.用法&#xff1a; 一、模板匹配 1.定义&#xff1a; 模板匹配就是在给定的图片中&#xff0c;查找和模板最相似的区域…

OpenCV学习笔记(十一)——模板匹配

模板匹配是指在当前图像A内寻找与图像B最相似的部分&#xff0c;一般将图像A称为输入图像&#xff0c;将图像B称为模板图像。模板匹配的操作方法是将模板图像B在图像A上滑动&#xff0c;遍历所有像素以完成匹配。 OpenCV学习笔记(十一&#xff09; 1. 模板匹配基础2. 多模板匹配…

opencv中的模板匹配

1 匹配函数 opencv 提供了一个专门用于模板匹配的函数 cv::matchTemplate();其调用方式如下&#xff1a; void cv::matchTemplate(cv::InputArray image, // 用于搜索的输入图像, 8U 或 32F, 大小 W-Hcv::InputArray templ, // 用于匹配的模板&#xff0c;和image类型相同&am…

【论文译文】BigGAN

译文仅供参考&#xff01; 原文是pdf&#xff0c;想下载的话可以戳&#xff1a;http://www.gwylab.com/pdf/biggan_chs.pdf

WGAN、WGAN-GP、BigGAN

一、WGAN概述 WGAN论文地址&#xff1a;https://arxiv.org/abs/1701.07875 在这篇论文中&#xff0c;作者研究了不同的测量方法&#xff0c;来描述模型生成样本和证实样本之间分布差距&#xff0c;或者说&#xff0c;不同的散度定义&#xff0c;在对比之后&#xff0c;认为EM…

tf hub bigGan 猫变狗

原文链接: tf hub bigGan 猫变狗 上一篇: tf hub mobile_net 使用 下一篇: tf hub 使用缓存 数据 根据输入的标签和噪声生成指定类别的图片&#xff0c;类似infogan 每次向着目标前进一小步&#xff0c;将其中的过程变化记录下来 import tensorflow as tf import n…

(2018, BigGAN)用于高保真自然图像合成的大规模 GAN 训练

Large scale gan training for high fidelity natural image synthesis 公众号&#xff1a;EDPJ 目录 0. 摘要 1. 简介 2. 背景 3. 扩展 GAN 3.1 使用截断技巧权衡多样性和保真度 3.2 总结 4. 分析 4.1 表征不稳定性&#xff1a;生成器 4.2 表征不稳定性&#xff1…

深度解读DeepMind新作:史上最强GAN图像生成器—BigGAN

在碎片化阅读充斥眼球的时代&#xff0c;越来越少的人会去关注每篇论文背后的探索和思考。 在这个栏目里&#xff0c;你会快速 get 每篇精选论文的亮点和痛点&#xff0c;时刻紧跟 AI 前沿成果。 点击本文底部的「阅读原文」即刻加入社区&#xff0c;查看更多最新论文推荐。 这…

基于飞桨实现BigGAN生成动漫图像——为艺术创作赋能

点击左上方蓝字关注我们 【飞桨开发者说】艾梦&#xff0c;深度学习业余选手&#xff0c;热衷于用AI创造新的可能性&#xff0c;努力探索发现未知的神奇世界。玩AI&#xff0c;我是认真的。 作为学力不足、码力有余的深度学习业余玩家&#xff0c;笔者在工作中忙里偷闲&#xf…

GAN变种介绍 - DCGAN、InfoGAN、CycleGAN、WGAN、Self-Attention GAN、BigGAN

GAN变种介绍 - DCGAN、InfoGAN、CycleGAN、WGAN、Self-Attention GAN、BigGAN 一、DCGAN二、InfoGAN三、CycleGAN四、WGAN五、Self-Attention GAN六、BigGAN 在原始的 GAN 论文中&#xff0c;Ian Goodfellow 从理论层面分析了 GAN 网络的收敛性&#xff0c;并且在多个经典图片数…

基于飞桨PaddlePaddle实现BigGAN生成动漫图像——为艺术创作赋能

作为学力不足、码力有余的深度学习业余玩家&#xff0c;笔者在工作中忙里偷闲&#xff0c;借助AI Studio的免费GPU继续自己对于生成对抗网络落地应用的相关研究。尽管深度学习已在工业生成中广泛应用&#xff0c;但作为研究重头的视觉效果极佳的GAN的图像生成&#xff0c;却在应…

深度学习(四十六)——StarGAN, InfoGAN, ProGAN, StyleGAN, BigGAN, FUNIT, CVAE

StarGAN 论文&#xff1a; 《StarGAN: Unified Generative Adversarial Networksfor Multi-Domain Image-to-Image Translation》 CycleGAN的局限在于&#xff1a;对于两个Domain之间的变换&#xff0c;需要两个G网络。可以想象&#xff0c;当Domain的数量上升时&#xff0c;…