用OpenCV进行模板匹配

这篇具有很好参考价值的文章主要介绍了用OpenCV进行模板匹配。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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()

显示图像如下:
用OpenCV进行模板匹配
假设我们的任务安排为通过基本的图像处理流程,从上图中找到我们需要的心动模板。弄清楚了具体的需求,我们直接开始编码吧!

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()

结果如下:
用OpenCV进行模板匹配

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();

结果如下:
用OpenCV进行模板匹配

6 模板匹配

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

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

结果如下:
用OpenCV进行模板匹配
上图中颜色越鲜艳的区域显示了和我们的模板相似度越高的区域,你注意到图像中明亮的颜色区域形成的形状了吗?如果我们假设模板在源图像中只找到一次,那么我们可以通过寻找具有最高值(~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);

得到结果如下:
用OpenCV进行模板匹配

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);

结果如下:
用OpenCV进行模板匹配

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

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);

最终结果如下:
用OpenCV进行模板匹配

8. 问题思考

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

9. 总结

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

到了这里,关于用OpenCV进行模板匹配的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV(十九):模板匹配

    1.模板匹配:      OpenCV提供了一个模板匹配函数,用于在图像中寻找给定模板的匹配位置。 2.图像模板匹配函数matchTemplate  void matchTemplate( InputArray image, InputArray templ, OutputArray result, int method, InputArray mask = noArray() ); image:待模板匹配的原图像,图像数据类型为CV 8U和CV 32F两者中

    2024年02月09日
    浏览(43)
  • Opencv——图像模板匹配

    什么是模板匹配呢? 看到这里大家是否会觉得很熟悉的感觉涌上心头!在人脸识别是不是也会看见 等等。 模板匹配可以看作是对象检测的一种非常基本的形式。使用模板匹配,我们可以使用包含要检测对象的“模板”来检测输入图像中的对象。 参数:(img: 原始图像、

    2024年02月16日
    浏览(41)
  • 008 OpenCV matchTemplate 模板匹配

    目录 一、环境 二、模板匹配算法原理 三、代码演示 本文使用环境为: Windows10 Python 3.9.17 opencv-python 4.8.0.74 cv.matchTemplate 是OpenCV库中的一个函数,用于在图像中查找与模板匹配的特征。它的主要应用场景是在图像处理、计算机视觉和模式识别等领域。 算法原理: cv.matchTempl

    2024年02月05日
    浏览(40)
  • OpenCV(11):模板匹配实例讲解

    在OpenCV中,模板匹配是一种图像处理技术,用于在一个大的图像中查找和定位一个小的目标图像(也称为模板)。 通俗而言,就是通过一张图片找到和另一张图片相似的部分。 从此章开始,opencv系列所有的之后更新的博客都会更注重实际应用,而不是仅仅简单讲解一个小方

    2024年02月04日
    浏览(38)
  • OPENCV C++(十二)模板匹配

    正常模板匹配函数  这里0代表的是方法,一般默认为0就ok  img是输入图像 templatee是模板 resultmat是输出 对于输出的说明: 就是说result图像中的每一个点的值代表了一次相似度比较结果。  如图可知,模板在待测图像上每次在横向或是纵向上移动一个像素,并作一次比较计算

    2024年02月13日
    浏览(41)
  • opencv 多角度模板匹配

    总结一下实现多角度模板匹配踩的坑 一 、多角度匹配涉及到要使用mask,首先opencv matchTemplateMask自带的源码如下: 可以看到使用用了四次dft来计算卷积,目标图像要与mask卷三次,来计算目标图像在模板区域内的和,平方和。其中最后一次CCorr(I, mask2)可以省略掉,它跟CCorr(I

    2024年02月07日
    浏览(44)
  • 【OpenCV】第十五章: 模板匹配

    第十五章: 模板匹配 模板匹配就是在给定的图片中查找和模板最相似的区域。 实现的方法是:将模板在图片上滑动(从左向右,从上向下),遍历所有滑窗,计算匹配度,将所有计算结果保存在一个矩阵种,并将矩阵中匹配度最高的值作为匹配结果。 一、单模板匹配 1、匹配函

    2024年02月02日
    浏览(40)
  • 图像模板匹配 opencv c++实现

    用T表示模板图像,I表示待匹配图像,切模板图像的宽为w高为h,用R表示匹配结果,匹配过程如下图所示: 1、平方差匹配算法method=TM_SQDIFF 这类方法利用平法差来进行匹配,最好匹配为0,而若匹配越差,匹配值则越大 2、归一化平方差匹配法method=TM_SQDIFF_NORMED 3、相关匹配法

    2024年02月04日
    浏览(46)
  • OpenCV自学笔记十八:模板匹配

    模板匹配是一种在图像中寻找指定模式的方法。OpenCV库提供了用于模板匹配的函数,可以帮助我们在图像中定位和识别特定的模式。下面是模板匹配的基础原理和一个示例: 模板匹配通过在待匹配图像上滑动一个固定大小的模板图像,并计算模板与图像之间的相似度来寻找匹

    2024年02月07日
    浏览(37)
  • Opencv (C++)系列学习---模板匹配

    目录 1.模板匹配的定义 2.API介绍 3.寻找最优匹配位置(匹配后的配套操作) 4.具体代码         模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域,该匹配方法并不是基于直方图,而是使用一个图像块在输入图像上进行“”滑动“”。(也就是在图像上按照

    2024年02月08日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包