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

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

  • 题目
  • 模板匹配原理
  • 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

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

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

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

相关文章

聊聊spring-cloud的负载均衡

聊聊spring-cloud的负载均衡 1. 选择合适的负载均衡算法2. 合理设置超时时间3. 缓存服务实例列表4. 使用断路器5. 使用缓存Spring Cloud负载均衡组件对比RibbonLoadBalancerWebClient对比 总结 在微服务架构中&#xff0c;负载均衡是非常重要的一个环节&#xff0c;可以有效地提…

python与深度学习(六):CNN和手写数字识别二

目录 1. 说明2. 手写数字识别的CNN模型测试2.1 导入相关库2.2 加载数据和模型2.3 设置保存图片的路径2.4 加载图片2.5 图片预处理2.6 对图片进行预测2.7 显示图片 3. 完整代码和显示结果4. 多张图片进行测试的完整代码以及结果 1. 说明 本篇文章是对上篇文章训练的模型进行测试…

极速跳板机登陆服务器

目录 一&#xff1a;简单登陆跳板器二&#xff1a;一键申请相关的服务器权限三&#xff1a;简化登陆 一&#xff1a;简单登陆跳板器 登陆公司提供的网址&#xff0c; 下载自己的专属RSA密钥。在密钥文件处&#xff0c; 执行登陆指令&#xff1a; ssh -p 36000 -i id_rsa 用户跳…

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

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

程序员进阶之路:程序环境和预处理

目录 前言 程序的翻译环境和执行环境 翻译环境 运行环境 预处理&#xff08;预编译&#xff09; 预定义符号 #define #define 定义标识符 #define 定义宏 #define 替换规则 #和## #的作用 ##的作用 带副作用的宏参数 宏和函数对比 命名约定 #undef 命令行定义 条件…

Task :app:javaPreCompileDebug FAILED

一,报错内容 在打包react native项目的时候,报错如下信息,我的项目的react-native版本比较低,是0.62… > Task :app:javaPreCompileDebug FAILED Execution failed for task :app:javaPreCompileDebug. > Could not resolve all files for configuration :app:debugCom…

Windows下YUICompress实现js、css混淆压缩

首先&#xff0c;我们针对Linux下的部分命令进行Windows系统的对应实现 ls————cmd /c dir/b rm————cmd /c del mv————cmd /c move pwd————cmd /c chdir 注&#xff1a;cmd /c是执行完命令后关闭命令行窗口、cmd /k是执行完命令后不关闭命令行窗口、cmd /c sta…

关于计算机的各种编码

ASCII编码 ASCII (American Standard Code for Information Interchange)&#xff1a;美国信息交换标准代码是基于的一套电脑编码系统&#xff0c;主要用于显示现代英语和其他语言。它是最通用的标准&#xff0c;并等同于国际标准 ISO/IEC 646。ASCII第一次以规范标准的类型发表…

如何在 SwiftUI 中使用 Touch ID 和 Face ID?

1. 需要通过指纹&#xff0c;面容认证后才能打开 App 2. 添加配置 需要向 Info.plist 文件中添加一个配置&#xff0c;向用户说明为什么要访问 添加 Privacy - Face ID Usage Description 并为其赋予值 $(PRODUCT_NAME) need Touch Id or Face ID permission for app lock 3. …

sql中group by 的使用

1、概述 Group By 从字面意义上理解就是根据By指定的规则对数据进行分组&#xff0c;所谓的分组就是将一个数据集划分为若干个小区域&#xff0c;然后针对若干个小区域进行数据处理 2、原始表 3、简单的Group By 示例1 select 类别&#xff0c;数量 as 数量之和 from A gro…

​MySQL高阶语句(三)

目录 1、内连接 2、左连接 3、右连接&#xff1a; 二、存储过程⭐⭐⭐ 4. 调用存储过程 5.查看存储过程 5.1 查看存储过程 5.2查看指定存储过程信息 三. 存储过程的参数 3.1存储过程的参数 3.2修改存储过程 四.删除存储过程 MySQL 的连接查询&#xff0c;通常都是将来…

(css)原生html实现遮罩层弹窗

(css)原生html实现遮罩层弹窗 效果&#xff1a; html <div class"overlay"><div class"content"><!-- 需要遮罩的内容 --> <el-table :data"tableData" size"mini" class"table-class" border stripe…

解决阿里云服务器不能访问端口

服务器已经下载了redis&#xff0c;kafka&#xff0c;但就是访问不了端口号&#xff0c; 开通云服务器以后&#xff0c;请一定在安全组设置规则&#xff0c;放行端口 防火墙要关闭

网络安全基础知识解析:了解常见的网络攻击类型、术语及其防范方法

目录 1、网络安全常识和术语 1.1资产 1.2网络安全 1.3漏洞 1.4 0day 1.5 1day 1.6后门 1.7exploit 1.8攻击 1.9安全策略 1.10安全机制 1.11社会工程学 2、为什么会出现网络安全问题&#xff1f; 2.1网络的脆弱性 2.4.1缓冲区溢出攻击原理&#xff1a; 2.4.2缓冲…

【简单认识MySQL函数和高级语句】

文章目录 一.常用查询1.按关键字排序&#xff08;ORDER BY 语句&#xff09;1、语法格式2、 ASC和DESC的排序概念3、举例1、按分数排序&#xff0c;默认不指定是升序排列2、分数按降序排列3、order by 还可以结合where进行条件过滤&#xff0c;筛选地址是南京的学生按分数降序排…

数据可视化——绘制带有时间线的柱状图

文章目录 前言如何绘制柱状图添加时间线根据提供的数据绘制动态柱状图读取并删除无用数据将数据转换为字典创建柱状图并添加到时间线中配置选项并生成带有数据的折线图 前言 我们已经学习了使用 pyecharts 包中的模块和相应的方法绘制了折线图和地图&#xff0c;那么今天我将为…

【MySQL】索引

索引 概念作用优势和劣势具体操作方式创建索引自动手动创建 查看索引删除索引 索引的数据结构哈希表二叉搜索树平衡二叉树B树B 树 概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c;并指定索引的类型&am…

中移链与BSN分布式云管平台集成,共同构建专属协同体系

01 中移链与BSN分布式云管平台集成&#xff0c; 融入BSN生态体系 中移链OPB&#xff08;OPB即开放联盟链&#xff0c;Open Permissioned Blockchain&#xff09;与BSN基于BSN分布式云管平台&#xff0c;打造了中移链专属门户、中移链专属运营、中移链专属运维功能模块&#x…

WebRTC带宽评估 -- Transport-wide Congestion Control

简述&#xff1a;在RTP包中增加transport-wide-cc扩展头&#xff0c;放置传输层面的包序号。视频接收端记录RTP包的接收时间&#xff0c;并通过RTCP Feedback消息反馈到视频发送端&#xff0c;发送端结合缓存的RTP包发送时间&#xff0c;基于丢包和延迟估算当前带宽&#xff0c…

【数据架构】Data Fabric 架构是实现数据管理和集成现代化的关键

D&A 领导者应该了解数据编织架构的关键支柱&#xff0c;以实现机器支持的数据集成。 在日益多样化、分布式和复杂的环境中&#xff0c;数据管理敏捷性已成为组织的任务关键优先事项。为了减少人为错误和总体成本&#xff0c;数据和分析 (D&A) 领导者需要超越传统的数据…