目录

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

一、模板匹配简介

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

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

  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] 该博客是本人原创博客,如果您对该博客感兴趣,想要转载该博客,请与我联系(qq邮箱:1575262785@qq.com),我会在第一时间回复大家,谢谢大家的关注.
[2] 由于个人能力有限,该博客可能存在很多的问题,希望大家能够提出改进意见。
[3] 如果您在阅读本博客时遇到不理解的地方,希望您可以联系我,我会及时的回复您,和您交流想法和意见,谢谢。
[4] 本文测试的图片可以通过该链接进行下载。网盘链接- 提取码:a2xc。
[5] 本人业余时间承接各种本科毕设设计和各种小项目,包括图像处理(数据挖掘、机器学习、深度学习等)、matlab仿真、python算法及仿真等,有需要的请加QQ:1575262785详聊!!!

Python+Opencv实现模板匹配相关推荐

  1. Python+OpenCV:模板匹配(Template Matching)

    Python+OpenCV:模板匹配(Template Matching) Template Matching with Single Objects ######################## ...

  2. python批量实现模板匹配处理,并将图片进行标记和裁剪保存

    简介 主要是通过python的opencv进行模板匹配识别到想要得到的物体: 然后通过opencv进行裁切图片,得到最终需要的图片 核心内容 ①模板匹配,带有nms的模板匹配 ②批量处理图片,并保存 ...

  3. Opencv java模板匹配-角点检测(11)

    函数 在opencv中有模板匹配的方法, Imgproc.matchTemplate(src, template, result, Imgproc.TM_CCOEFF); 这个方法输入的参数分别是: ...

  4. Python+OpenCV:特征匹配(Feature Matching)

    Python+OpenCV:特征匹配(Feature Matching) Basics of Brute-Force Matcher Brute-Force matcher is simple. It ...

  5. 基于VS与OpenCV的模板匹配学习(4):手写OpenCV matchTemplate()

    基于VS与OpenCV的模板匹配学习(4):手写OpenCV matchTemplate() 文章目录 基于VS与OpenCV的模板匹配学习(4):手写OpenCV matchTemplate() 前 ...

  6. OpenCV:模板匹配

    小程序「跳一跳」的自动化. 主要涉及到了OpenCV的模板匹配和边缘检测技术,以及Android开发调试工具ADB. 如果放在一起说,感觉内容有些多. 所以,分三期来讲,也能多了解一些东西. 首先介绍 ...

  7. 基于opencv的模板匹配详解

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

  8. opencv 多角度模板匹配

    总结一下实现多角度模板匹配踩的坑 一 .多角度匹配涉及到要使用mask,首先opencv matchTemplateMask自带的源码如下: static void matchTemplateMask ...

  9. Opencv(六)模板匹配、轮廓检测、轮廓周围绘制矩形框和圆形框

    模板匹配介绍 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域. 所以模板匹配首先需要一个模板图像T(给定的子图像) 另外需要一个待检测的图像-源图像S 工作方法,在带检测图像上,从左到右,从 ...

最新文章

  1. 捆绑调整Bundle Adjustment(最速下降法、牛顿法、Levenberg-Marquartdt法)
  2. 4G模块ME3760_V2的拨号过程
  3. VisualStudio.gitignore git 忽略
  4. 艾默生变频器ev1000故障代码_国产变频器型号大全,梳理国产变频的前世今生!...
  5. python 生成器函数_Python 生成器函数
  6. 服役七年超级计算机,太费电 曾经的最快超级计算机服役5年即退休
  7. mvn 汇编_【答疑解惑】艺术生留学小白问题答疑汇编之精华
  8. 手机电脑普通浏览器或UC浏览器缓存或下载的Y2hlbmppbmdjb25n0 Y2hlbmppbmdjb25n1 m3u8视频.ts格式视频合并工具成一个mp4
  9. 约约约,文章约起来!
  10. 纳米红光更安全的养生方式——红光光浴#大健康#红光光浴#红光#种光光学
  11. sublime text 3143 授权码
  12. Kalilinux2017.2安装搜狗拼音输入法
  13. Android热更新,Android面试题整理
  14. 【vue+pc端】实现微信扫码登录pc端,后端通过微信开发平台,前端生成二维码(仅供参考)
  15. 独家专访京东区块链技术专家刘春伟:大厂BaaS扎堆,京东如何走C位?
  16. 随机森林的java算法_spark 随机森林算法案例实战
  17. 高德地图markevents_高德地图markers生成和点击
  18. Kafka单机版安装教程及测试(附每一步操作截图及说明)【一看就懂】
  19. linux下fdisk命令实战案例之详解
  20. 2D激光雷达:使用MindStudio进行MindX SDK任务开发

热门文章

  1. 设计模式的征途—3.工厂方法(Factory Method)模式
  2. Javascript - ExtJs - 组件 - 分页
  3. 十大技巧优化Android App性能
  4. SharePoint 使用脚本为表单绑定事件
  5. 在word文档里提取出所有的邮箱地址
  6. Nginx 禁止访问某个目录或文件的设置方法
  7. Mybatis源码: Builder Mapper Executor
  8. 对Hibernate赖加载对象在session容器之外的获取方法
  9. ebs 供应商地点信息_EBS标准的查看供应商地址
  10. c语言无符号数除法,[求助]关于双字节无符号数除法