【数字图像处理与应用】模板匹配

news2024/11/23 23:28:50

【数字图像处理与应用】模板匹配

  • 题目
  • 模板匹配原理
  • Matlab代码实现
    • 算法介绍
    • 显示图像的匹配结果 (最匹配的一个)
      • MATLAB实现
      • 运行结果
        • 图像的相关值结果:
        • 在原图像上绘制检测到的目标位置:
        • 显示检测到的目标坐标:
    • 显示图像的匹配结果 (最匹配的三个,阈值 0.95)
      • MATLAB实现
        • 图像的相关值结果:
        • 在原图像上绘制检测到的目标位置:
        • 显示检测到的目标坐标:
  • 相关代码文档下载

题目

给定图像car.png和模版图像wheel.png,利用相关检测实现对car图像中的wheel检测,具有最大相关值的位置可以解释为所检测到的wheel位置。程序的输入是图像和模版,要求:
(i)显示图像的相关值结果;
(ii)列出在图像中检测到的所有目标的(x,y)坐标。

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

模板匹配原理

  • 原图像: f ( x , y ) f(x, y) f(x,y), 模板图象: T ( x , y ) T(x, y) T(x,y), 模板大小 M × N M \times N M×N
  • 在图像 f f f 中定位模板 T T T 的位置, 采用相关匹配
  • 算法:采用模板 T T T 在图像 f f f 中逐点计算相关, 具有最大相关值 ρ ( x , y ) \rho(x, y) ρ(x,y) 的位置 ( x , y ) (x, y) (x,y) 为模板 T T T 所在 位置
    ρ ( x , y ) = ∑ k = − M 2 M 2 ∑ l = − N 2 N 2 f ( x + k , y + l ) ⋅ T ( M 2 + k , N 2 + l ) / ∑ k = − M 2 M 2 ∑ l = − N 2 N 2 f ( x + k , y + l ) 2 ∑ k = − M 2 M 2 ∑ l = − N 2 N 2 T ( M 2 + k , N 2 + l ) 2 \rho(x, y)=\sum_{k=-\frac{M}{2}}^{\frac{M}{2}} \sum_{l=-\frac{N}{2}}^{\frac{N}{2}} f(x+k, y+l) \cdot T\left(\frac{M}{2}+k, \frac{N}{2}+l\right) / \sqrt{\sum_{k=-\frac{M}{2}}^{\frac{M}{2}} \sum_{l=-\frac{N}{2}}^{\frac{N}{2}} f(x+k, y+l)^2} \sqrt{\sum_{k=-\frac{M}{2}}^{\frac{M}{2}} \sum_{l=-\frac{N}{2}}^{\frac{N}{2}} T\left(\frac{M}{2}+k, \frac{N}{2}+l\right)^2} ρ(x,y)=k=2M2Ml=2N2Nf(x+k,y+l)T(2M+k,2N+l)/k=2M2Ml=2N2Nf(x+k,y+l)2 k=2M2Ml=2N2NT(2M+k,2N+l)2

Matlab代码实现

算法介绍

  • 读取原图像和模板图像
  • STEPS 2. 计算相关值
  • 显示和保存相关值结果图像:(要求 (i))
  • 检测目标的坐标
  • 在原图像上绘制检测到的目标位置
  • 显示检测到的目标坐标:(要求 (ii))

显示图像的匹配结果 (最匹配的一个)

MATLAB实现

% 读取原图像和模板图像
image = imread('car.png');
template = imread('wheel.png');

% 将图像和模板转换为灰度图像
grayImage = im2double(im2gray(image));
grayTemplate = im2double(im2gray(template));

% 获取图像和模板的大小
imageSize = size(grayImage);
templateSize = size(grayTemplate);

% 初始化相关值结果矩阵
correlation = zeros(imageSize(1), imageSize(2));

% 计算相关值(PDF中给的图像匹配公式)
for y = 1:imageSize(1)
    for x = 1:imageSize(2)
        numerator = 0;
        denominator1 = 0;
        denominator2 = 0;
        
        % 遍历模板中的每个像素,if条件是为了排除异常值
        for l = -floor(templateSize(1)/2):floor(templateSize(1)/2)
            for k = -floor(templateSize(2)/2):floor(templateSize(2)/2)
                % 计算相关匹配公式的分子
                if y + l >= 1 && y + l <= imageSize(1) && x + k >= 1 && x + k <= imageSize(2)
                    numerator = numerator + grayImage(y + l, x + k) * grayTemplate(l + floor(templateSize(1)/2) + 1, k + floor(templateSize(2)/2) + 1);
                end
                
                % 计算相关匹配公式的分母的第一个部分
                if y + l >= 1 && y + l <= imageSize(1) && x + k >= 1 && x + k <= imageSize(2)
                    denominator1 = denominator1 + grayImage(y + l, x + k)^2;
                end
                
                % 计算相关匹配公式的分母的第二个部分
                denominator2 = denominator2 + grayTemplate(l + floor(templateSize(1)/2) + 1, k + floor(templateSize(2)/2) + 1)^2;
            end
        end
        
        % 计算相关值
        correlation(y, x) = numerator / (sqrt(denominator1) * sqrt(denominator2));
    end
end

% 显示相关值结果图像
figure;
imshow(correlation, []);
% 保存图像到本地
imwrite(correlation, '图像的相关值结果.png');

% 检测目标的坐标(相关值最大的)
[maxValue, maxIndex] = max(correlation(:));
[maxY, maxX] = ind2sub(imageSize, maxIndex);
targetCoordinates = [maxX, maxY];
disp('检测到的目标的相关值:');
disp(maxValue);


% 在原图像上绘制检测到的目标位置
figure;
imshow(image);
hold on;
rectangle('Position', [maxX-floor(templateSize(2)/2), maxY-floor(templateSize(1)/2), templateSize(2), templateSize(1)], 'EdgeColor', 'r', 'LineWidth', 2);
saveas(gcf, '检测结果(最匹配的).png');



% 显示检测到的目标坐标
disp('检测到的目标坐标:');
disp(targetCoordinates);

运行结果

图像的相关值结果:

在这里插入图片描述

在原图像上绘制检测到的目标位置:

在这里插入图片描述

显示检测到的目标坐标:

在这里插入图片描述

显示图像的匹配结果 (最匹配的三个,阈值 0.95)

MATLAB实现

% 读取原图像和模板图像
image = imread('car.png');
template = imread('wheel.png');


% 将图像和模板转换为灰度图像
grayImage = im2double(im2gray(image));
grayTemplate = im2double(im2gray(template));



% 获取图像和模板的大小
imageSize = size(grayImage);
templateSize = size(grayTemplate);

% 初始化相关值结果矩阵
correlation = zeros(imageSize(1), imageSize(2));

% 计算相关值(PDF中给的图像匹配公式)
for y = 1:imageSize(1)
    for x = 1:imageSize(2)
        numerator = 0;
        denominator1 = 0;
        denominator2 = 0;
        
        % 遍历模板中的每个像素,if条件是为了排除异常值
        for l = -floor(templateSize(1)/2):floor(templateSize(1)/2)
            for k = -floor(templateSize(2)/2):floor(templateSize(2)/2)
                % 计算相关匹配公式的分子 
                if y + l >= 1 && y + l <= imageSize(1) && x + k >= 1 && x + k <= imageSize(2)
                    numerator = numerator + grayImage(y + l, x + k) * grayTemplate(l + floor(templateSize(1)/2) + 1, k + floor(templateSize(2)/2) + 1);
                end
                
                % 计算相关匹配公式的分母的第一个部分
                if y + l >= 1 && y + l <= imageSize(1) && x + k >= 1 && x + k <= imageSize(2)
                    denominator1 = denominator1 + grayImage(y + l, x + k)^2;
                end
                
                % 计算相关匹配公式的分母的第二个部分
                denominator2 = denominator2 + grayTemplate(l + floor(templateSize(1)/2) + 1, k + floor(templateSize(2)/2) + 1)^2;
            end
        end
        
        % 计算相关值
        correlation(y, x) = numerator / (sqrt(denominator1) * sqrt(denominator2));
    end
end

% 设置相关阈值,根据实际情况调整
threshold = 0.95;
%设置成0.95可以检测相关值最高的3个轮子(cat中长的最接近的三个轮子)
%注:第四个轮子只是整体视觉上相似,但细节上很多不一样的地方,所以相关值低,检测不到
%设置成1则可以检测相关性最高的轮子
% 检测目标的坐标
targetCoordinates = [];
disp("检测到的目标的相关值:")
for y = 1:imageSize(1)
    for x = 1:imageSize(2)
       
        if correlation(y, x) >= threshold
             disp(correlation(y, x))
            targetCoordinates = [targetCoordinates; x, y];
        end
    end
end

% 显示相关值结果图像
figure;
imshow(correlation, []);



% 在原图像上绘制检测到的目标位置
figure;
imshow(image);
hold on;

% 绘制检测到的所有目标位置
for i = 1:size(targetCoordinates, 1)
    targetX = targetCoordinates(i, 1);
    targetY = targetCoordinates(i, 2);
    
    % 计算模板的左上角和右下角坐标
    templateTopLeft = [targetX - floor(templateSize(2)/2), targetY - floor(templateSize(1)/2)];
    templateSize = [templateSize(2), templateSize(1)];  % 调整模板大小为 [宽度, 高度]
    
    rectangle('Position', [templateTopLeft, templateSize], 'EdgeColor', 'r', 'LineWidth', 2);
end
% 显示检测到的目标坐标
disp('检测到的目标坐标:');
disp(targetCoordinates);

图像的相关值结果:

在这里插入图片描述

在原图像上绘制检测到的目标位置:

在这里插入图片描述

显示检测到的目标坐标:

在这里插入图片描述

相关代码文档下载

https://download.csdn.net/download/weixin_66397563/88067710

声明:未经允许,请勿转载

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

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

相关文章

计讯物联5G千兆网关TG463赋能无人船应用方案,开启自动巡检的智能模式

方案背景 水电站、水库、堤坝等水利工程水下构筑物常年处于水下&#xff0c;并在复杂的水流环境下运行&#xff0c;难免会出现磨蚀、露筋等损伤&#xff0c;而传统的安全监测方式一般是通过潜水员检查上层水柱或通过降低水位进行人工巡查&#xff0c;不仅成本高&#xff0c;效…

深入理解Linux网络——TCP协议三次握手和四次挥手详细流程

文章目录 一、三次握手流程二、为什么握手是三次三、关闭连接的情况四、四次挥手流程五、为什么挥手是四次 系列文章&#xff1a; 深入理解Linux网络——内核是如何接收到网络包的深入理解Linux网络——内核与用户进程协作之同步阻塞方案&#xff08;BIO&#xff09;深入理解L…

EGE-UNet, 轻量化U-Net

随着transform 的出现&#xff0c;现在语义分割网路结构越来越复杂&#xff0c;轻量化网路也较少了&#xff0c;有些轻量化也只是名义上的轻量化。今天我看到一篇很好的论文&#xff0c;上海交大发表在 MICCAI 2023 的最新研究工作&#xff0c;一个称为Efficient Group Enhance…

堆排序与直接选择排序

目录 一、直接选择排序 1.基本思想 2.直接选择排序的特性总结 3.代码实现&#xff1a; 二、堆排序 1. 概念&#xff1a; 2.图像实现&#xff1a; 3.代码实现&#xff1a; 一、直接选择排序 1.基本思想 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09…

Edge 中比较独特的调试技巧

背景 大家日常开发基本都会使用 Chrome&#xff0c;毕竟确实好用。但是基于 Chromium 的新版 Microsoft Edge 已于 2020 年 1 月 15 日发布。 Edge 目前的使用基本跟 Chrome 差不多了&#xff0c;但显然&#xff0c;Edge 团队不仅仅想当 Chrome 的备用。他们也提供了一些特有…

Matlab中实现对一幅图上的局部区域进行放大

大家好&#xff0c;我是带我去滑雪&#xff01; 局部放大图可以展示图像中的细节信息&#xff0c;使图像更加直观和精美&#xff0c;此次使用magnify工具实现对绘制的figure选择区域绘制&#xff0c;图像效果如下&#xff1a; 1、基本图像绘制 这里选择绘制一个散点图&#xff…

jar 命令实践

jar -h非法选项: h 用法: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ... 选项:-c 创建新档案-t 列出档案目录-x 从档案中提取指定的 (或所有) 文件-u 更新现有档案-v 在标准输出中生成详细输出-f 指定档案文件名-m 包含指定清单文…

JAVA SE -- 第十天

&#xff08;全部来自“韩顺平教育”&#xff09; 一、枚举&#xff08;enumeration&#xff0c;简写enum&#xff09; 枚举是一组常量的集合 1、实现方式 a.自定义类实现枚举 b.使用enum关键字实现枚举 二、自定义类实现枚举 1、注意事项 ①不需要提供setXxx方法&#xff…

EMA:指数移动平均

Exponential Moving Average 目的&#xff1a;使得参数变化更加顺滑 设原参数为 param_updates [0.1, 0.2, -0.1, 0.3, -0.2] 使用ema进行变换 param_ema 0 alpha 0.9 for param in params:param_ema alpha * param_ema (1 - alpha) * paramprint(param_ema) 结果为…

【ArcGIS Pro二次开发】(52):布局导出图片(批量)

在ArcGIS Pro中设定好布局后&#xff0c;可以直接导出为各种类型的图片。 这是很基本的功能&#xff0c;但是如果你的布局很多&#xff0c;一张一张导图就有点费劲。 之前有网友提出希望可以批量导图&#xff0c;要实现起来并不难&#xff0c;于是就做了这个工具。 一、要实现…

Flutter系列(3):如何将Flutter项目打包成Android安装包

将Flutter项目打包成Android安装包&#xff0c;主要步骤如下&#xff1a; 一、生成key 进入jdk的bin目录下&#xff1a; keytool -genkey -v -keystore D:\key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key 大概会有密码等参数&#xff0c;根据自身需要&#x…

软工导论知识框架(一)软件工程学概述

本贴为B站大连工业大学老师的网课笔记&#xff0c;教材为张海藩第6版&#xff0c;适用于考研和期末复习。 导图比较拥挤&#xff0c;看不清可以单独保存或者放大页面。 一.软件&#xff1a; 软件指的是计算机程序、文档运行程序必须的数据、方法与规则。 方法指的是软件开发…

SpringCloud-Alibaba之Sentinel熔断与限流

一、下载安装运行 http://localhost:8080进行访问 登录账号和密码均为sentinel 二、创建工程&#xff0c;并注册到nacos服务中心 依赖spring-cloud-starter-alibaba-nacos-discovery,spring-cloud-starter-alibaba-sentinel sentine-datasource-nacos (持久化)配置文件 se…

LAXCUS分布式操作系统:人工智能最后一公里

随着人工智能技术的飞速发展&#xff0c;越来越多的应用场景开始涌现。然而&#xff0c;在实际应用中&#xff0c;人工智能技术仍然面临着许多挑战&#xff0c;其中最大的挑战之一就是如何实现人工智能的“最后一公里”。这一问题主要体现在以下几个方面&#xff1a; 计算资源…

【UniApp开发小程序】”我的“界面实现+“信息修改“界面实现+登出账号实现+图片上传组件【基于若依管理系统开发】

文章目录 界面实现界面效果我的修改信息 “我的”界面实现api页面退出账号让自我介绍只显示一行&#xff0c;结尾多余的字使用...代替跳转到信息修改页面 信息修改界面实现api页面动态给对象设置属性名和值修改密码图片上传组件 部分后端代码Controller 界面实现 界面效果 我…

CTF PWN-攻防世界CGfsb格式化字符串漏洞

文章目录 前言格式化字符串漏洞格式化字符串漏洞基本原理简单典型案例 漏洞的危害与利用拒绝服务攻击内存数据读取内存数据覆盖 攻防世界&#xff1a;CGfsg题目思路简析任意地址覆写 总结 前言 距离 2021 年年底短暂接触学习 CTF PWN 相关知识&#xff08;CTF PWN-攻防世界XCT…

Matlab对FS32K144编程--CAN通讯

1、系统运行时间周期-10ms 2、配置CAN通讯初始化---波特率&#xff1a;500k&#xff0c;测试用CAN0 3、设置初始化配置优先级最高 4、清除CAN接受中断标志位初始化--仅运行一次&#xff0c;把要接受的CAN地址都要配置一下&#xff0c;如ID:0X245 5、建立全局变量--从单片机向外…

Android Studio安装和设置SDK、Gradle(国内源)、AVD下载目录详细教程

本机环境&#xff1a;win11家庭版 Android Studio版本&#xff1a;android-studio-2022.2.1.20-windows 文章目录 安装Android Studio官网下载安装Android Studio设置Android Studio的gradle使用的JDK版本设置Android Studio的SDK下载目录设置虚拟设备内存 设置Android Studio…

MySQL主从复制原理及实验

原理 1.环境搭建 1.需要两台服务器&#xff0c;如我的分别是&#xff1a; 1. -》 192.168.197.146---主库 2. -》 192.168.197.147---从库 2.分别关闭防火墙或者放行mysql端口号3306 如&#xff1a; systemctl stop firewalld systemctl disable firewalld 2.配置主库…