图像模板匹配算法(MATLAB)

模板匹配是一种用于在图像中定位和识别对象的技术。它的基本思想是:

  1. 提取图像中的一个子图像作为“模板”(template)。这个子图像通常包含我们感兴趣的目标对象。

  2. 在整个原始图像上,逐点比较模板和原始图像的相似度。相似度通常用归一化的交叉相关(Normalized Cross Correlation, NCC)来度量。

  3. 当相似度达到最大时,原始图像中的该位置就是模板的匹配位置。也就是我们要找的目标对象的位置。

主要的步骤包括:

  1. 获取模板图像:先从原图像中裁剪包含目标的子图像作为模板图。

  2. 在原图像上滑动模板,计算每个位置的相似度:用模板图像在原图像上逐步滑动,每个位置计算模板图和原图的重叠区域的相似度。常用的相似度度量方法是归一化的交叉相关(NCC)。

  3. 寻找最佳匹配:相似度最大的位置即为最佳匹配位置,对应模板图像在原图像的位置。

  4. 设置相似度阈值:只有相似度大于某一阈值的匹配结果才是有效的。

模板匹配简单高效,应用广泛,但只适用于目标变形不大的情况。当目标发生旋转、缩放等变换时,效果会下降。这时可以考虑改进的模板匹配方法或其他更advanced的方法。

MATLAB代码如下:

clc;close all;clear all;warning off;%清除变量
rand('seed', 100);
randn('seed', 100);
format long g;

% im1=imread('1face.bmp');% 读入模板图像
% im2=imread('eye.bmp');%读入测试图像

im1=imread('S.jpg');
im2=imread('letters.jpg');


result=matchfun(im1,im2);

figure;
subplot(1,3,1);
imshow(im1);
title('模板');%显示模板
subplot(1,3,2);
imshow(im2);
title('测试图像');%显示测试图像
subplot(1,3,3);
imshow(result);
title('匹配结果');

function result=matchfun(image1,image2)
%*********************************************************
%如果是三维图像就转换为二维灰度图像
if size(image1,3)==3
    image1=rgb2gray(image1);
end
if size(image2,3)==3
    image2=rgb2gray(image2);
end
% 通过图片的尺寸判断哪个是测试图片哪个是模板
if size(image1)>size(image2)
    Target=image1;
    Template=image2;
else
    Target=image2;
    Template=image1;
end
% 取得两幅图片的尺寸
[r1,c1]=size(Target);
[r2,c2]=size(Template);
% 模板的均值
image22=Template-mean(mean(Template));%X-E(X)

%两幅图像的相关性
M=[];%相关系数 矩阵
for i=1:(r1-r2+1)%横向搜索
    for j=1:(c1-c2+1)%纵向搜索
        Nimage=Target(i:i+r2-1,j:j+c2-1); %区域的选取,r2,c2为选取的大小
        Nimage=Nimage-mean(mean(Nimage));  %Y-E(Y)
        corr=sum(sum(Nimage.*image22));%E(X)*E(Y)取和与Cov(X,Y)成正比
        warning off
        M(i,j)=corr/(sqrt(sum(sum(Nimage.^2)))*sqrt(sum(sum(image22.^2))));%X与Y均方差的积
    end
end
% 在测试的图像中标注出目标的位置
result=plotbox(Target,Template,M);

function result=plotbox(Target,Template,M);
%**********判断目标的位置并标记************
[r1,c1]=size(Target);
[r2,c2]=size(Template);

[r,c]=max(M);%r每一列的最大值,c每列最大值所在的行数,都为一维矩阵
[r3,c3]=max(max(M));%r3 矩阵中的最大值,c3最大值所在的列数
%确定最大值点的坐标
i=c(c3);%行数
j=c3;%列数
result=Target;
%画上边的横线
for x=i:i+r2-1
   for y=j%一个像素点的宽度
       result(x,y)=255;%画线设置成白色
   end
end
%画下边的横线
for x=i:i+r2-1
   for y=j+c2-1
       result(x,y)=255;
   end
end
%画左边的竖线
for x=i
   for y=j:j+c2-1
       result(x,y)=255;
   end
end
%画右边的竖线
for x=i+r2-1
   for y=j:j+c2-1
       result(x,y)=255;
   end
end

程序结果如下:

完整代码:https://download.csdn.net/download/corn1949/88794750

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tensorflow2.0笔记 - where,scatter_nd, meshgrid相关操作

本笔记记录tf.where进行元素位置查找,scatter_nd用于指派元素到tensor的特定位置,meshgrid用作绘图的相关操作。 import tensorflow as tf import numpy as np import matplotlib.pyplot as plttf.__version__#where操作查找元素位置 #输入的tensor是Tr…

OJAC近屿智能张立赛博士揭秘GPT Store:技术创新、商业模式与未来趋势

Look!👀我们的大模型商业化落地产品📖更多AI资讯请👉🏾关注Free三天集训营助教在线为您火热答疑👩🏼‍🏫 亲爱的伙伴们: 1月31日晚上8:30,由哈尔滨工业大学的…

WPF入门到跪下 第十一章 Prism(五)IOC的依赖注入

IOC的依赖注入 一、构造函数方式的依赖注入 以项目启动时MainWindowViewModel的依赖注入为例,默认情况下Prism框架的项目,在打开窗口时会自动匹配主窗口的视图模型类(PrismApplication启动),这里是MainWindowViewMod…

LeetCode 使循环数组所有元素相等的最少秒数

地址:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 难度:中等 题目描述:给你一个下标从 0 开始长度为 n 的数组 nums 。 每一秒,你可以对数组执行以下操作: 对于范围在 [0, n - 1] 内的每…

多线程事务如何回滚?

背景介绍 1,最近有一个大数据量插入的操作入库的业务场景,需要先做一些其他修改操作,然后在执行插入操作,由于插入数据可能会很多,用到多线程去拆分数据并行处理来提高响应时间,如果有一个线程执行失败&am…

基础知识总结

概念概述 计算机网络是通过传输介质、通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统。而网络编程就是编写程序使联网的两个或多个设备(比如计算机)之间进行数据传输。Java语言对网…

PHP微信UI在线聊天系统源码 客服私有即时通讯系统

(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买) DuckChat是一套完整的私有即时通讯解决方案,包含服务器端程序和各种客户端程序(包括iOS、Android、PC等)。通过Duck…

鸿蒙 ArkTS 从数组内查找指定的数据

let arr [1, 2, 3, 4, 5]; let target 3; let result arr.filter(item > item target); let a String(result) 将数字转换成文本型 console.log(a); 亲爱的读者: 首先,我要感谢您抽出宝贵的时间阅读这篇文章。我深知,您的每一分每一…

黑马程序员学习:产品卡片

黑马程序员前端web入门:产品卡片 几点学习到的: text-align:center; text-align 属性规定将元素内的文本内容在水平方向上居中对齐,可以设置块级元素内文本的水平对齐方式,但是不能让块级元素内部的块级元素居中。需要…

启动盘重装ubuntu22系统

win+R msinfo32查看 插入制作好的u盘电脑开机 进入BIOS界面的方法有多种,以下是一些常见的方法: 方法一:通过重启计算机进入BIOS 关闭计算机,等待几秒钟。按下计算机电源按钮,开始启动计算机。在计算机启动时,通常会显示厂商的Logo,如Dell、HP等。在显示Logo的时候…

C++引用详解

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、引用的概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间…

3分钟搞定幻兽帕鲁联机,手动搭建专属服务器

《幻兽帕鲁》的热潮正在席卷游戏界。对于那些更喜欢与熟悉的伙伴们共同探险的玩家来说,搭建一个私人服务器无疑是最佳选择。拥有个人服务器不仅意味着更高的隐私性,还允许你根据喜好调整游戏参数,比如改变游戏内的工作速度倍率、经验值获取倍…