计算机视觉——基于OpenCV和Python进行模板匹配

news2024/11/16 14:07:51

模板匹配?

模板匹配是它允许在一幅较大的图像中寻找是否存在一个较小的、预定义的模板图像。这项技术的应用非常广泛,包括但不限于图像识别、目标跟踪和场景理解等。

目标和原理

模板匹配的主要目标是在一幅大图像中定位一个或多个与模板图像相匹配的区域。这个过程就像是用一个“放大镜”在大图像上移动,不断比较模板图像与大图像中相应位置的相似度。通过计算模板图像和大图像中各个位置的像素差异,可以找到与模板图像最为相似的区域。

比较方法

在执行模板匹配时,有多种比较方法可供选择,这些方法决定了如何计算模板图像与大图像之间的相似度。以下是一些常用的比较方法:

  1. 相关性(Correlation): 这种方法通过计算模板图像和大图像中相应区域的像素值的乘积和来评估相似度。当乘积和最大时,表示两个图像在该位置的匹配度最高。

  2. 差异(Difference): 与相关性相反,差异方法通过计算模板图像和大图像中相应区域的像素值差的绝对值或平方值来评估相似度。在这种方法中,差异值最小的地方表示匹配度最高。

  3. 归一化交叉相关(Normalized Cross-Correlation): 这是一种更为健壮的比较方法,它通过将模板图像和大图像的像素值与各自的平均值进行比较来计算相似度。这种方法对于光照变化和图像对比度的变化具有更好的适应性。

  4. 平方差(Squared Difference): 这种方法计算模板图像和大图像中相应区域的像素值差的平方和。平方差越小,表示匹配度越高。

  5. 相关系数(Correlation Coefficient): 这是一种基于统计学的方法,它通过计算模板图像和大图像之间的相关系数来评估它们的相似度。相关系数的值介于-1和1之间,值越接近1,表示匹配度越高。

使用OpenCV进行模板匹配

OpenCV提供了cv2.matchTemplate()函数,用于执行模板匹配。

该函数接受以下参数:

  • image – 要在其中搜索模板的较大图像。
  • template – 在搜索的模板图像。
  • method – 要使用的比较方法。有多种可用的比较方法。

然后,函数返回一个包含比较结果的矩阵。矩阵中的每个元素都将具有一个值,指示模板图像与较大图像区域的匹配程度。

# 导入必要的包
import cv2

# 加载主图像和模板图像
image = cv2.imread("examples/1.jpg")
template = cv2.imread("examples/template1.jpg")

# 制作图像的副本
image_copy = image.copy()

# 将图像转换为灰度图像
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
template_gray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)

# 获取模板图像的宽度和高度
template_h, template_w = template.shape[:1]

# 使用归一化交叉相关方法执行模板匹配
result = cv2.matchTemplate(image_gray, template_gray, cv2.TM_CCOEFF_NORMED)

# 找到结果矩阵中最佳匹配的位置
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

# 在最佳匹配周围绘制矩形
top_left = max_loc
bottom_right = (top_left[0] + template_w, top_left[1] + template_h)
cv2.rectangle(image_copy, top_left, bottom_right, (0, 255, 0), 2)

# 显示图像
cv2.imshow("Image", image)
cv2.imshow("Template", template)
cv2.imshow("Matched Template", image_copy)
cv2.waitKey(0)

在这里插入图片描述
在这里插入图片描述

多模板匹配与OpenCV

如果想要在一张图像中检测同一对象的多个实例怎么办?在这种情况下,需要对代码进行一些修改。在之前的代码中,只获取了最佳匹配的位置。可以修改代码,以便获取所有高于某个阈值的匹配位置。

import cv2
import numpy as np

# 设置模板匹配和非极大值抑制阈值
thresh = 0.98
nms_thresh = 0.6

# 加载主图像和模板图像
image = cv2.imread("examples/2.jpg")
template = cv2.imread("examples/template2.jpg")

# 制作图像的副本
image_copy = image.copy()

# 将图像转换为灰度图像
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
template_gray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)

# 获取模板图像的宽度和高度
template_h, template_w = template.shape[:1]

# 使用归一化交叉相关方法执行模板匹配
result = cv2.matchTemplate(image_gray, template_gray, cv2.TM_CCOEFF_NORMED)

# 获取高于阈值的匹配位置的坐标
y_coords, x_coords = np.where(result >= thresh)

print("找到的匹配数量:", len(x_coords))

# 循环遍历坐标并在匹配周围绘制矩形
for x, y in zip(x_coords, y_coords):
    cv2.rectangle(image_copy, (x, y), (x + template_w, y + template_h), (0, 255, 0), 2)

# 显示图像
cv2.imshow("Template", template)
cv2.imshow("Multi-Template Matching", image_copy)
cv2.waitKey(0)

在这里插入图片描述
在这里插入图片描述

非极大值抑制在多模板匹配中的应用

非极大值抑制(Non-Maximum Suppression,简称NMS)是目标检测算法中的一个重要步骤,特别是在处理涉及多个模板的情况时,它有助于消除冗余的重叠边界框。OpenCV提供了一个名为cv2.dnn.NMSBoxes()的函数,可以用来执行非极大值抑制。

创建一个边界框列表,使用匹配的坐标,这些匹配的分数高于设定的阈值:

# 创建边界框列表
boxes = np.array([[x, y, x + template_w, y + template_h]
                 for (x, y) in zip(x_coords, y_coords)])

接下来,对这些边界框应用非极大值抑制:

# 应用非极大值抑制到边界框
indices = cv2.dnn.NMSBoxes(
    boxes, result[y_coords, x_coords], thresh, nms_thresh)

cv2.dnn.NMSBoxes()函数接受边界框、分数、阈值和非极大值抑制阈值作为参数。

分数是由模板匹配函数返回的值。只需要获取高于阈值的匹配分数。在上面的代码中,可以通过result[y_coords, x_coords]表达式来做到这一点。

thresh参数在这里不是很重要,因为我们已经过滤掉了低于阈值的匹配。

nms_thresh参数是非极大值抑制阈值。我们已经将其设置为0.6。

函数返回经过非极大值抑制后仍然存在的边界框的索引。例如,回到之前的例子中,这里有8个边界框:

[[347 134 420 206]
 [348 134 421 206]
 [433 134 506 206]
 [347 219 420 291]
 [348 219 421 291]
 [433 219 506 291]
 [348 220 421 292]
 [433 220 506 292]]

应用非极大值抑制后,得到这个索引列表:

[2 5 1 4]

因此,索引2、5、1和4指的是经过非极大值抑制后仍然存在的边界框。可以使用这些索引来保留那些经过非极大值抑制后仍然存在的边界框。

for i in indices:
    (x, y, w, h) = boxes[i][0], boxes[i][1], boxes[i][2], boxes[i][3]
    cv2.rectangle(image, (x, y), (w, h), (0, 255, 0), 2)

然后在主图像上绘制边界框。结果将与之前的相似,但如果仔细观察,会发现边界框的厚度不同。这是因为使用非极大值抑制去除了重复的边界框。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1605409.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

05.MySQL索引事务

1. 索引 1.1 概念 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。 可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现 1.2 作用 数据库中的表、数据、索引之间的关系,类似于书架上的…

链表创建的陷阱与细节

链表是线性表的一种,它在逻辑结构上是连续的,在物理结构上是非连续的。 也就是说链表在物理空间上是独立的,可能是东一块西一块的。如下顺序表和链表在内存空间上的对比: 而链表的每一块空间是如何产生联系实现在逻辑结构上是连续…

pycharm永久改变sys.path

进入pycharm,选择file->settings->interpreter 在这里选择图中所示show all 再单击左上角减号右侧第三个,长得像思维导图的图标 之后添加你的路径,确认即可

vim使用指南:指令、配置、插件、异常

文章目录 vi / vim命令模式插入模式光标定位复制粘贴删除撤销替换删除查找 底行模式保存退出行号查找多开其他 视图模式注释 异常vim配置vim插件 vi / vim vim的本质是一个编辑器,是一种多模式的编辑器,只能进行读写操作,不能进行编译编辑器…

jmeter-while控制器用法

condition中添加while结束循环的条件,以下语句的意思是,当percent等于100时,就跳出while循环继续执行 ${__javaScript("${percent}" ! 100)} 举例,以下方法是getPercent为一个引出的异步接口,该接口的返回包…

uni-admin中引入uni-cms的缺少schema及uni-media-library缺少云函数的问题

1. 在管理端运行提示一些表找不到,因为是uni-admin关联的uni-starter的服务空间,在uni-admin的uniCloud中没有内容,在uni-starter的uniCloud中也没有发现对应的表,后面干脆在云端找到对应的表之后新建了,然后再下载到本…

盲人导航功能特点:革新出行体验的实时避障应用深度解析

作为一名资深记者,我有幸亲历并详尽报道一款专为盲人群体设计的导航应用叫做蝙蝠避障,它不仅提供了精准的路线指引,更创新性地融入了实时避障功能。这款应用凭借其盲人导航功能特点,正以前所未有的方式提升盲人的出行自由度与安全…

https证书是什么,怎么申请

https证书的名称有很多,其本名是SSL/TLS数字证书,本意是实现https访问的证书,故而很多人会称之为https证书,又因为其需要部署于域名服务器之上,所以也有人称之为域名证书。 所以https证书又名SSL证书、域名证书等。 h…

【Web】Dest0g3 520迎新赛 题解(全)

目录 phpdest EasyPHP SimpleRCE funny_upload EasySSTI middle PharPOP ezip NodeSoEasy Really Easy SQL&easysql EzSerial ljctr phpdest 尝试打pearcmd,但似乎没有写文件的权限 ?config-create/&file/usr/local/lib/php/pearcmd.php&a…

FreeRTOS_day3

1.总结任务调度算法之间的区别,重新实现一遍任务调度算法的代码。 抢占式调度:高优先级的任务可以打断低优先级的任务执行 时间片轮转:相同优先级的任务有相同的时间片(1ms),时间片耗尽任务会强制退出 协…

2024 抖音欢笑中国年(五):Wasm、WebGL 在互动技术中的创新应用

前言 随着 Web 前端技术的不断发展,越来越多的新兴技术方案被引入到 Web 开发中,其中 Wasm 和 WebGL 作为前端领域的两大利器,为开发者带来了更多的可能性。 本文将结合2024 年抖音欢笑中国年的部分项目,重点介绍如何利用 Wasm 和…

前端三剑客 HTML+CSS+JavaScript ② HTML相关概念

他们这样形容我 是暴雨浇不灭的火 —— 24.4.18 学习目标 理解 HTML的概念 HTML的分类 HTML的关系 HTML的语义化 应用 HTML骨架格式 sublime基本使用 一、HTML初识 HTML指的是超文本标记语言,是用来描述网页的一种语言 HTML不是一种编程语言,而是一种标记…

C语言开发的医学影像数字化PACS系统源码 带三维重建和还原的PACS源码

C语言开发的医学影像数字化PACS系统源码 带三维重建和还原的PACS源码 PACS全称Picture Archivingand Communication Systems。它是应用在医院影像科室的系统,主要的任务就是把日常产生的各种医学影像(包括核磁,CT,超声&#xf…

CSS基础+基本选择器和复合选择器(如果想知道CSS的基础+基本选择器和复合选择器知识点,那么只看这一篇就足够了!)

前言:在我们学习完了html之后,我们就要开始学习三大件中的第二件—CSS,CSS 可以控制多重网页的样式和布局,也就是将我们写好的html代码加上一层华丽的衣裳,使网页变得更加精美。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨…

halcon瓶身表面缺陷检测-滤波差值法

前言 在瓶子,灌装产业中,通常需要瓶子的瓶身进行检测,防止其出现划痕,破洞等情况。但是通常瓶身出现的缺陷都非常小,往往只是一些细小的划痕,这种情况就非常容易被误判为OK情况。 所以采用滤波差值法&…

Stability AI 发布 SD3 API:开启人工智能新篇章

文章目录 1.Stable Diffusion 3 API开放了! 2.Stability AI Document地址3.获取API Key4.API方式调用SD3出图接口地址接口请求规范接口请求响应结果 5.Stable Diffusion 3.0、Stable Image Core、Fooocus 2.3.1、MidJounery效果查看 1.Stable Diffusion 3 API开放了! Stabilit…

js高级 笔记02

目录 01 object提供的一些静态方法 02 词法作用域 03 作用域链 04 arguments的使用 05 开启严格模式 06 高阶函数 07 闭包 01 object提供的一些静态方法 Object.create() 对象继承 Object.assign(对象1,对象2) 对象合并 可以将对象2 里面的可枚举属性和自身的属性合并到…

压缩感知的概述梳理(3)

参考文献 Adaptive embedding: A novel meaningful image encryption scheme based on parallel compressive sensing and slant transform 文献内容 梳理 列表形式 并行压缩感知核心元素与流程 信号 x 长度:N表示:(x \sum_{i1}^{N} a_i\psi_i \su…

软件测试面试:关键问题解析

在软件开发领域,测试是确保软件质量的重要环节。面试是评估软件测试人员技能和经验的关键时刻。在一个软件测试面试中,面试官通常会问一系列问题来评估面试者的知识、技能和解决问题的能力。本文将介绍一些常见的软件测试面试问题,并给出一些…

电脑开不了机?不要慌,三招教你快速解决!

电脑开不了机是我们在日常使用中可能遇到的一个严重问题,它会影响我们的工作和生活。了解如何解决电脑开不了机的问题对于维护电脑正常运行至关重要。本文将介绍三种常见的解决电脑开不了机的方法,帮助您快速恢复电脑的正常使用。 方法1:检查…