用OpenCV进行模板匹配

news/2024/11/20 2:31:08/

1. 引言

今天我们来研究一种传统图像处理领域中对象检测和跟踪不可或缺的方法——模板匹配,其主要目的是为了在图像上找到我们需要的图案,这听起来十分令人兴奋。

所以,事不宜迟,让我们直接开始吧!

2. 概念

模板匹配的算法的核心十分简单:它将模板与源图像中的每个部分进行比较,逐像素滑动。结果是一个相似度的图,该相似度图中每个像素值反映了模板与源图像中该位置的相似程度。

从本质上讲,它将模板在图像上进行卷积,类似于卷积神经网络中使用卷积核的方式。通过这个过程,创建了一个新的图像或矩阵,其中每个像素值表示模板与源图像中相应区域之间的相似性。通过分析该结果图像,我们可以识别峰值,这些峰值表示源图像中存在模板图像的精确位置。值得注意的是,模板匹配的实现可能会有所不同,主要是基于相似性的度量因方法各异而不同,这里不做扩展展开。

3. 举个栗子

巴拉巴拉讲了一堆概念性的文字,好多小伙伴会感觉到枯燥无味,基于此,我们来看我们的例子,首先我们引入我们需要的基础库,如下:

# Import libraries
import numpy as np
import matplotlib.pyplot as plt
from skimage.io import imread, imshow
from skimage.color import rgb2gray
from skimage.feature import match_template
from skimage.feature import peak_local_max

紧接着,我们来观察我们的用例图像,代码如下:

original_image = imread('emojis.png')
plt.figure(figsize=(20,20))
plt.imshow(original_image)
plt.title('Original Image', fontsize=20, weight='bold')
plt.axis('off')
plt.show()

显示图像如下:
在这里插入图片描述
假设我们的任务安排为通过基本的图像处理流程,从上图中找到我们需要的心动模板。弄清楚了具体的需求,我们直接开始编码吧!

4. 图像灰度化

虽然模板匹配适用于彩色图像,但让我们简化并将图像转换为灰度图来减少计算量。
灰度化代码如下:

# Convert the image to grayscale
gray_image = rgb2gray(original_image[:,:,:3])
plt.figure(figsize=(20,20))
plt.imshow(gray_image, cmap='gray')
plt.title('Grayscale Image', fontsize=20, weight='bold')
plt.axis('off')
plt.show()

结果如下:
在这里插入图片描述

5. 加载模板

现在,让我们从灰度图中截取一个心动的表情作为我们的目标模板,代码如下:

template = gray_image[1330:1850,625:1140]
plt.figure(figsize=(10,10))
plt.imshow(template, cmap='gray')
plt.title('Template Image', fontsize=20, weight='bold')
plt.axis('off')
plt.show();

结果如下:
在这里插入图片描述

6 模板匹配

通过使用 skimage 库中的match_template函数 , 我们可以得到衡量模板图和原图的相似度的热力图,如下:

result = match_template(gray_image, template)
plt.figure(figsize=(10,10))
imshow(result, cmap='viridis')
plt.show();

结果如下:
在这里插入图片描述
上图中颜色越鲜艳的区域显示了和我们的模板相似度越高的区域,你注意到图像中明亮的颜色区域形成的形状了吗?如果我们假设模板在源图像中只找到一次,那么我们可以通过寻找具有最高值(~1.00)的像素来找到它的位置。代码如下:

x, y = np.unravel_index(np.argmax(result), result.shape)
imshow(gray_image)
template_width, template_height = template.shape
rect = plt.Rectangle((y, x), template_height, template_width, color='y', fc='none')
plt.gca().add_patch(rect);

得到结果如下:
在这里插入图片描述

7. 设置容忍度

为了定位模板的多个匹配,我们可以通过设定相关性值的峰值的容忍度来实现,代码如下:

imshow(gray_image)
template_width, template_height = template.shape
for x, y in peak_local_max(result, threshold_abs=0.99):rect = plt.Rectangle((y, x), template_height, template_width, color='red', fc='none')plt.gca().add_patch(rect);

结果如下:
在这里插入图片描述

进而可以通过以下代码,将结果画到原图,如下所示:

plt.figure(figsize=(20, 20))
plt.imshow(original_image)
plt.title('We found our heart eyes emojis!', fontsize=20, weight='bold', color='red')
template_width, template_height = template.shape
for x, y in peak_local_max(result, threshold_abs=0.99):rect = plt.Rectangle((y, x), template_height, template_width, color='red', fc='none')plt.gca().add_patch(rect);

最终结果如下:
在这里插入图片描述

8. 问题思考

  • 如果我们改变阈值会发生什么?降低阈值将给我们更多的匹配(但也会有更多的误报),而提高阈值将使匹配更少,但可能更准确。
  • 放大模板怎么样?模板越大,我们得到的匹配项就越少。这是因为匹配的大小必须与模板的大小几乎相同。
  • 水平翻转模板?这可能会导致没有匹配,因为模板匹配对方向很敏感。
  • 更改图像对比度?只要模板和原图像发生相同的更改,匹配项就应该保持有效。然而,剧烈的变化可能会改变结果。

9. 总结

本文重点介绍了在传统图像处理中,如何利用模板匹配的方法来进行从表情包图像中寻找心动表情模板的样例,并给出了相应的代码实现。由于是传统方案,该方法的阈值选择和泛化能力都有一定的局限性,但是学习其背后的原理可以帮助我们更好的理解相关理论概念。


http://www.ppmy.cn/news/528656.html

相关文章

屏蔽 手机QQ黄钻官方团队总送礼物 的简单方法

手机qq进去好友动态,左上角自己头像,进去后右上角三道杠,弹出窗口里选黄钻官网,右上角我的,黄钻活动通知管理里面,关闭

Java实现QQ授权登录网站

现在的很多网站 为了让用户可以快速登录 使用第三方QQ、微信、微博之类的授权登录 QQ互联的官网地址 1:先去QQ互联申请成为开发者 当审核通过之后 就可以创建一个应用 然后开发实际的登录效果啦 2:直接上QQ授权登录的代码 package com.xinjue.web…

6.企业应用架构模式 --- 会话状态

1.无状态的价值无状态服务器意味着什么?对对象来说,它们结合了状态(数据)和行为。一个真正无状态的对象是没有成员变量的。然而,这不是人们在分布式企业应用中所指的无状态。分布式企业应用中的无状态服务器是指在各次请求之间不保存状态的对…

QQ联合登录

引言 🏂 在一个网站或者应用程序中,登录注册功能的重要性不言而喻。从原来繁琐的普通登录、手机验证码登录、邮箱登录到现在简约的QQ联合登录、微信联合登录、微博登录以及国外的Facebook、Twitter等多种方登录方式。 第三方社交账号来登录&#xff0c…

Java 实现QQ第三方登录

Java 实现QQ第三方登录 郑清 2018-12-17 17:56:05 6509 收藏 27 分类专栏&#xff1a; -----❺、框架/第三方工具 </div></div><div class"up-time"><span>最后发布:2018-12-17 17:56:05</span><span>首发:2018-12-17 17:56…

web实现QQ第三方登录(java版)

简介&#xff1a; 主要逻辑在java实现&#xff0c;h5只有一个a标签调用接口。 后台分两个接口&#xff1a; 接口1&#xff1a;登录前缀接口&#xff0c;h5负责调用唤醒QQ授权。 接口2&#xff1a;需要在腾讯开放平台配置回调地址的接口&#xff0c;就是授权成功后回调。 j…

张小龙《微信背后的产品观》演讲文字版

简单就是美——从苹果单按钮到微信摇一摇 今天很感谢大家从这么远的地方跑到广州来&#xff0c;对于产品的分享&#xff0c;我个人是挺有兴趣的&#xff0c;我觉得能够探讨一下怎么做产品&#xff0c;本身也是挺有意思的一件事情。 我们现在用的很多是苹果的东西&#xff0c;…

Spring Boot整合Security系列步骤及问题排查(十一)—— 集成QQ登录

工具类准备&#xff1a; Repository&#xff1b; Connection&#xff1b; ConnectionFactory&#xff08;ServiceProvider、ApiAdapter&#xff09;&#xff1b; ServiceProvider&#xff08;OAuth2Operations、Api&#xff09;&#xff1b; Api&#xff1a; /*** QQ接口** a…