模板匹配——基于模板与基于特征的两种模板匹配对比

概述

在人工智能(AI)的研究领域中,模板匹配不仅是一个重要的研究课题,也是解决图像处理中核心问题——定位兴趣区域的关键方法之一。通过模板匹配,可以准确地识别和定位给定图像中的特定对象。这项技术在对象检测、跟踪、监控、医学成像以及图像拼接等多个领域都有着广泛的应用。

模板匹配

模板匹配主要涉及两个核心要素:源图像和模板图像。源图像是期望在其中寻找模板图像匹配的图像,而模板图像则是用于与源图像的子图像进行比较的参考图像。

源图像:
在这里插入图片描述

模板图像:
在这里插入图片描述

在图像匹配算法可分为两大类别,基于模板的匹配和基于特征的匹配各具特色。
1.基于模板的方法,也被称作区域匹配法,适用于模板图像在图像中缺乏显著特征的情况。这种方法直接处理像素值,通过计算图像与模板的强度值来衡量匹配程度。
2.基于特征的方法则适用于源图像和模板图像在特征和控制点上有较高一致性的情况。此时,特征可以是点、曲线或表面模型,用于执行模板匹配。

基于模板

传统的模板匹配通过滑动模板图像与源图像进行对比。模板图像逐像素地在源图像上移动,通过计算重叠区域的相似性数值来寻找匹配。通常,两幅图像会被转换成二值或黑白图像,然后应用如归一化交叉相关、交叉相关和平方差和等匹配技术。
然而,基于模板的方法在处理尺度变化时面临挑战。源图像或模板图像的尺寸变化会影响匹配算法的效果。为了解决这个问题,一个常用的技巧是将模板图像调整到多个尺度,然后与源图像进行比较。在遍历所有尺度后,选择具有最高相关系数的区域作为“匹配”区域。但是,这种方法难以解决旋转不变性问题。为此,Kim, Hae & Araújo, Sidnei(2007年)提出了Ciratefi算法,该算法通过改进蛮力算法——即在每个角度旋转模板图像——来解决旋转问题。Ciratefi算法的计算速度比蛮力算法快400倍,且结果相同。

实现代码:

#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
 
using namespace std;
using namespace cv;
 
bool use_mask;
Mat img; Mat templ; Mat mask; Mat result;
const char* image_window = "Source Image";
const char* result_window = "Result window";
 
int match_method;
int max_Trackbar = 5;
 
void MatchingMethod( int, void* );
 
const char* keys =
"{ help h| | Print help message. }"
"{ @input1 | Template_Matching_Original_Image.jpg | image_name }"
"{ @input2 | Template_Matching_Template_Image.jpg | template_name }"
"{ @input3 | | mask_name }";
 
int main( int argc, char** argv )
{
 CommandLineParser parser( argc, argv, keys );
 samples::addSamplesDataSearchSubDirectory( "doc/tutorials/imgproc/histograms/template_matching/images" );
 
 img = imread( samples::findFile( parser.get<String>("@input1") ) );
 templ = imread( samples::findFile( parser.get<String>("@input2") ), IMREAD_COLOR );
 
 if(argc > 3) {
 use_mask = true;
 mask = imread(samples::findFile( parser.get<String>("@input3") ), IMREAD_COLOR );
 }
 
 if(img.empty() || templ.empty() || (use_mask && mask.empty()))
 {
 cout << "Can't read one of the images" << endl;
 return EXIT_FAILURE;
 }
 
 namedWindow( image_window, WINDOW_AUTOSIZE );
 namedWindow( result_window, WINDOW_AUTOSIZE );
 
 const char* trackbar_label = "Method: \n 0: SQDIFF \n 1: SQDIFF NORMED \n 2: TM CCORR \n 3: TM CCORR NORMED \n 4: TM COEFF \n 5: TM COEFF NORMED";
 createTrackbar( trackbar_label, image_window, &match_method, max_Trackbar, MatchingMethod );
 
 MatchingMethod( 0, 0 );
 
 waitKey(0);
 return EXIT_SUCCESS;
}
 
void MatchingMethod( int, void* )
{
 Mat img_display;
 img.copyTo( img_display );
 
 int result_cols = img.cols - templ.cols + 1;
 int result_rows = img.rows - templ.rows + 1;
 
 result.create( result_rows, result_cols, CV_32FC1 );
 
 bool method_accepts_mask = (TM_SQDIFF == match_method || match_method == TM_CCORR_NORMED);
 if (use_mask && method_accepts_mask)
 { matchTemplate( img, templ, result, match_method, mask); }
 else
 { matchTemplate( img, templ, result, match_method); }
 
 normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );
 
 double minVal; double maxVal; Point minLoc; Point maxLoc;
 Point matchLoc;
 
 minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );
 
 if( match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED )
 { matchLoc = minLoc; }
 else
 { matchLoc = maxLoc; }
 
 rectangle( img_display, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 );
 rectangle( result, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 );
 
 imshow( image_window, img_display );
 imshow( result_window, result );
 
 return;
}

基于特征的方法

特征检测与匹配是许多计算机视觉都有应用,例如运动结构、图像检索、物体检测等。

特征检测与匹配的应用:

  • 自动化物体跟踪
  • 计算视差的点匹配
  • 立体校准(基础矩阵估计)
  • 基于运动的分割
  • 识别
  • 三维物体重建
  • 机器人导航
  • 图像检索和索引

特征:

特征是与解决特定应用相关的计算任务相关的信息。特征可能是图像中的特定结构,如点、边缘或物体。特征也可能是应用于图像的一般邻域操作或特征检测的结果。特征可以分为两大类:

  • 图像中特定位置的特征,如山峰、建筑物角落、门道或形状有趣的雪块。这些局部化的特征通常称为关键点特征(或角点),通常通过围绕点位置的像素块的外观来描述。
  • 可以根据其方向和局部外观(边缘轮廓)进行匹配的特征称为边缘,它们也可以作为图像序列中物体边界和遮挡事件的良好指示。

特征检测与匹配的主要组成部分:

  • 检测:识别兴趣点
  • 描述:每个特征点周围的局部外观以某种方式描述,理想情况下在光照、平移、尺度和平面旋转变化下是不变的。我们通常为每个特征点得到一个描述符向量。

兴趣点:

兴趣点或特征点是纹理表达丰富的点。兴趣点是物体边界方向突然改变的点或两条或多条边缘段的交点。

兴趣点的特性:

  • 它在图像空间中有明确定义的位置或很好地局部化。
  • 它在图像域的局部和全局扰动下稳定,如光照/亮度变化,以便可以可靠地计算兴趣点,并具有高度的重复性。
  • 应提供有效的检测。

可能的方法:

  • 基于图像的亮度(通常通过图像导数)。
  • 基于边界提取(通常通过边缘检测和曲率分析)。

识别算法:

  • 哈里斯角
  • SIFT(尺度不变特征变换)
  • SURF(加速稳健特征)
  • FAST(加速段测试特征)
  • ORB(定向FAST和旋转BRIEF)

特征描述符:

特征描述符是一种算法,它接受一张图像并输出特征描述符/特征向量。特征描述符将有趣的信息编码成一系列数字,并作为一种数值“指纹”,可以用来区分一个特征与另一个特征。
理想情况下,这些信息在图像变换下是不变的,因此即使图像以某种方式变换,我们也可以再次找到该特征。在检测到兴趣点后,我们继续为每个兴趣点计算描述符。描述符可以分为两类:

  • 局部描述符:它是点的局部邻域的紧凑表示。局部描述符试图仅在点周围的局部邻域中模仿形状和外观,因此在匹配方面非常适用。
  • 全局描述符:全局描述符描述整个图像。它们通常不太稳健,因为图像的一部分变化可能会导致它失败,因为它会影响生成的描述符。

算法:

  • SIFT(尺度不变特征变换)
  • SURF(加速稳健特征)
  • BRISK(二进制稳健不变可扩展关键点)
  • BRIEF(二进制稳健独立基本特征)
  • ORB(定向FAST和旋转BRIEF)

特征匹配:

特征匹配或通常的图像匹配,是许多计算机视觉应用的一部分,如图像注册、相机校准和物体识别,其任务是在两个相同场景/对象的图像之间建立对应关系。图像匹配的常见方法包括从图像数据中检测一组兴趣点,每个点都与图像描述符相关联。一旦从两个或多个图像中提取了特征及其描述符,下一步就是在这些图像之间建立一些初步的特征匹配。

通常,基于兴趣点的匹配方法的性能取决于底层兴趣点的特性和相关图像描述符的选择。因此,应使用适合图像内容的检测器和描述符在应用程序中。例如,如果图像包含细菌细胞,则应使用斑点检测器而不是角点检测器。但是,如果图像是城市的航拍图,则使用角点检测器适合找到人造结构。此外,选择一个能够解决图像退化的检测器和描述符非常重要。

算法:

  • 暴力匹配器
  • FLANN(快速近似最近邻库)匹配器

特征检测与匹配算法:

  • 找到一组独特的关键点
  • 为每个关键点定义一个区域
  • 提取并标准化区域内容
  • 从标准化区域计算局部描述符
  • 匹配局部描述符

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Week-Y4】修改yolov5s中C3模块的结构,common.py文件解读

修改C3模块的结构 一、commom.py文件解析二、修改代码&#xff0c;运行train.py训练 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 &#x1f4d5;本次任务&#xff1a;将yolov5s网络模型…

Dynamo之雪花分形(衍生式设计)

你好&#xff0c;这里是BIM的乐趣&#xff0c;我是九哥~ 今天简单分享一些我收集的Dynamo的雪花分形案例吧&#xff0c;不过多讲解了&#xff0c;有兴趣的小伙伴&#xff0c;可以私信“雪花分形”获取案例文件&#xff0c;下面基本以分享为主&#xff1a; ******多图预警****…

第四百四十二回

文章目录 1. 概念介绍2. 使用方法2.1 获取思路2.2 获取方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取屏幕相关参数"相关的内容&#xff0c;本章回中将介绍如何获取AppBar的高度.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《含储能接入的三相配电网分布式可再生能源可调度域建模与计算》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

糟糕,Oracle归档满RMAN进不去,CPU98%了!

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

程序员延寿指南:科学延寿 20 年 | 开源日报 No.214

geekan/HowToLiveLonger Stars: 28.7k License: Unlicense HowToLiveLonger 是一个程序员延寿指南项目。 该项目旨在提供关于如何延长寿命的指南&#xff0c;特别是针对程序员群体。该项目包括术语、目标、关键结果、分析、行动和证据等内容&#xff0c;涵盖了各种与健康相关的…

C语言要点细细梳理——番外:运算符优先级

C语言中的运算符优先级决定了在没有括号的情况下&#xff0c;表达式中的各个部分应如何求值。这个优先级是固定的&#xff0c;并且遵循一定的规则。当运算符的优先级相同时&#xff0c;运算的方向&#xff08;从左到右或从右到左&#xff09;则称为运算符的结合性。 下面是一个…

JAVA基础03-scanner,输出,循环,if的使用以及eclipse的安装

目录 scanner的使用 if语句的使用 eclipse的使用 switch语句的使用 输出方法的使用 循环语句 scanner的使用 实现用户数据的交互&#xff0c;用户通过终端输入数据 注意&#xff1a;使用Scanner需要导包 在程序开头加上&#xff1a;import java.util.Scanner; //由于S…

2024免费Mac苹果解压压缩包软件BetterZip5

在2024年&#xff0c;对于Mac电脑用户来说&#xff0c;如果你想要无需解压就能快速查看压缩文档的内容&#xff0c;BetterZip是一个极佳的选择。这款软件不仅支持多种格式的压缩和解压&#xff0c;如zip、rar、7z、tar等&#xff0c;还具备丰富的功能和设置&#xff0c;包括预览…

异地组网怎么管理?

在当今信息化时代&#xff0c;随着企业的业务扩张和员工的分布&#xff0c;异地组网已经成为越来越多企业的需求。异地组网管理相对来说是一项复杂而繁琐的任务。本文将介绍一种名为【天联】的管理解决方案&#xff0c;帮助企业更好地管理异地组网。 【天联】组网的优势 【天联…

《pytorch深度学习实战》学习笔记第2章

第2章 预训练网络 讨论3种常用的预训练模型&#xff1a; 1、根据内容对图像进行标记&#xff08;识别&#xff09; 2、从真实图像中生成新图像&#xff08;GAN&#xff09; 3、使用正确的英语句子来描述图像内容&#xff08;自然语言&#xff09; 2.1 获取一个预训练好的网络…

c++宏有什么离谱操作?

Boost.Preprocessor确实是一个非常强大而复杂的C宏库&#xff0c;专门用于元编程&#xff0c;即在编译时进行代码生成和变换。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习编程不妨点个关注&#xff0c;给个评论222&…

WordPress建站教程:10步快速搭建个人网站

WordPress是一个广泛使用的内容管理系统&#xff08;CMS&#xff09;&#xff0c;凭借其用户友好的界面和大量可定制的主题和插件&#xff0c;为WordPress 提供了多功能性和灵活性&#xff0c;可用于创建各种类型的网站&#xff0c;包括个人博客、B2B企业网站、B2C外贸网站等&a…

骨架屏:提升用户体验的巧妙技巧

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

CleanMyMac2024拥有优化Mac电脑所需的所有工具,深层清理、恶意软件移除、用CleanMyMac X就够了!

CleanMyMac X 拥有优化 Mac 电脑所需的所有工具&#xff1a;深层清理、恶意软件移除、性能提升…… 优化 Mac 电脑&#xff0c;用 CleanMyMac X 就够了&#xff01; CleanMyMac作为一款专为Mac用户设计的系统清理和优化软件&#xff0c;通过其独特的功能和特性&#xff0c;帮助…

Linux集群(二)集群搭建与keeplived配置

目录 一、集群搭建 1.复制3份Tomcat 2.测试Tomcat 3. 配置nginx.conf配置文件 二、keeplived 1.什么是keeplived 2.keeplived特点 3.下载和安装 3.1下载 3.2安装 3.3配置keeplived.conf配置文件 3.4测试 一、集群搭建 集群的主要目的是解决并发的问题。 1.复制3…

【QT+QGIS跨平台编译】056:【pdal_lazperf+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdal_lazperf介绍二、pdal下载三、文件分析四、pro文件五、编译实践一、pdal_lazperf介绍 pdal_lazperf 是 PDAL(Point Data Abstraction Library)的一个插件,用于处理点云数据。PDAL 是一个开源的库,用于处理和分析地理空间数据,特别是点云…

详解TCP/IP五层模型

目录 一、什么是TCP五层模型&#xff1f; 二、TCP五层模型的详细内容 1. 应用层 2. 传输层 3. 网络层 4. 数据链路层 5. 物理层 三、网络设备所在分层 封装和分⽤ 三、Java示例 引言&#xff1a; 在网络通信中&#xff0c;TCP/IP协议是至关重要的。为了更好地理解TCP协议的工…

SD-WAN组网,协助企业业务需求灵活调整带宽和网络资源

随着企业网络需求的不断增长和变化&#xff0c;传统的网络架构已经不能满足企业灵活调整带宽和网络资源的需求。而SD-WAN&#xff08;软件定义广域网&#xff09;作为一种新型的网络架构&#xff0c;可以帮助企业实现灵活调整带宽和网络资源&#xff0c;满足不同业务需求。本文…

Cisco Modeling Labs (CML) 2.7 - 网络仿真工具

Cisco Modeling Labs (CML) 2.7 - 网络仿真工具 思科建模实验室 (CML) 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-modeling-labs-2/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 Cisco Modeling Labs 是我们用于网络仿真的首要平台。凭借易…