基于matlab的可乐标签模板匹配

1 建模思路

1.图像预处理

  • 如果目标图像和模板图像是彩色的(即RGB图像),则将它们转换为灰度图像,以便在单通道上进行匹配。
  • 使用rgb2gray函数进行灰度化。

2.获取模板大小

  • 使用size函数获取模板图像的高度(templateHeight)和宽度(templateWidth)。

3.初始化差异矩阵

  • 创建一个矩阵differenceMatrix,其大小为目标图像大小减去模板大小再加1(因为不需要考虑模板边界之外的位置)。
  • 这个矩阵将用于存储目标图像中每个可能位置与模板图像之间的平方差之和。

4.遍历目标图像

  • 使用两个嵌套的for循环遍历目标图像中的每个可能位置(即模板可以放置的每个位置)。

5.提取子图像

  • 对于目标图像中的每个可能位置,提取一个与模板大小相同的子图像。

6.计算平方差之和

  • 对于每个子图像和模板图像,计算它们之间的平方差之和。
  • 平方差之和的公式为:

        其中,S(i,j) 是目标图像中子图像在位置 (i,j) 的像素值,T(i,j) 是模板图像在相应位置的像素值,templateHeight 和 templateWidth 分别是模板图像的高度和宽度。这个公式用于计算目标图像中每个可能位置与模板图像之间的平方差之和,以找到最佳匹配位置。

7.找到最佳匹配位置

  • differenceMatrix中找到最小平方差的位置,即最佳匹配位置。
  • 使用min函数找到最小值及其索引。

8.绘制匹配结果

  • 使用imshow函数显示目标图像。
  • 使用rectangle函数在最佳匹配位置绘制一个绿色矩形框。

        通过这种方式,代码实现了基于平方差之和的模板匹配算法,用于在目标图像中找到与模板图像最匹配的位置。

2 代码

% 读取目标图像和模板图像  
targetImage = imread('image.png'); % 替换为您的目标图像文件  
templateImage = imread('template.png'); % 替换为您的模板图像文件  
figure;
subplot(1,2,1),imshow(targetImage);
title('原始目标图像');
subplot(1,2,2),imshow(templateImage);
title('原始模板图像');
% 转换为灰度图像(如果它们不是)  
if size(targetImage, 3) == 3  
    targetImage = rgb2gray(targetImage);  
end  
if size(templateImage, 3) == 3  
    templateImage = rgb2gray(templateImage);  
end  
  
% 获取模板图像的大小  
[templateHeight, templateWidth] = size(templateImage);  
  
% 初始化一个矩阵来存储每个位置的平方差之和  
differenceMatrix = zeros(size(targetImage) - [templateHeight-1, templateWidth-1]);  
  
% 遍历目标图像中的每个可能位置  
for y = 1:size(targetImage, 1) - templateHeight + 1  
    for x = 1:size(targetImage, 2) - templateWidth + 1  
        % 提取目标图像中当前位置的子图像  
        subImage = targetImage(y:y+templateHeight-1, x:x+templateWidth-1);  
          
        % 计算子图像与模板图像之间的平方差之和  
        differenceMatrix(y, x) = sum(sum((double(subImage) - double(templateImage)).^2));  
    end  
end  
  
% 找到最小平方差的位置(即最佳匹配)  
[minVal, minLoc] = min(differenceMatrix(:));  
[bestY, bestX] = ind2sub(size(differenceMatrix), minLoc);  
  
% 绘制匹配到的矩形区域  
figure;
subplot(1,3,1),imshow(targetImage);
title('灰色目标图像');
subplot(1,3,2),imshow(templateImage);
title('灰色模板图像');
subplot(1,3,3),imshow(targetImage); hold on;  
rectangle('Position', [bestX, bestY, templateWidth, templateHeight], 'EdgeColor', 'g', 'LineWidth', 2);  
title('匹配结果');  
hold off;

3 运行结果

图2-1 原始目标图像与原始模板图像

图2-2 模板匹配结果

        为了看清匹配结果,这里对匹配结果图像局部放大如图2-3所示:

图2-3 匹配结果局部放大图

        从图2-3可以看出本文建模比较成功。

4 调整

        这里对目标图像与模板图像不再灰度化直接进行模板匹配,且矩形标记线宽进行微调。

4.1 代码
% 读取目标图像和模板图像  
targetImage = imread('image.png'); % 替换为您的目标图像文件  
templateImage = imread('template.png'); % 替换为您的模板图像文件   
  
% 确保模板图像小于或等于目标图像  
[templateRows, templateCols, ~] = size(templateImage);  
[targetRows, targetCols, ~] = size(targetImage);  
if templateRows > targetRows || templateCols > targetCols  
    error('模板图像不能大于目标图像');  
end  
  
% 初始化一个存储最小差值和对应位置的变量  
minDiff = Inf;  
bestLoc = [0, 0];  
  
% 遍历目标图像,寻找与模板图像的最佳匹配  
for i = 1:targetRows-templateRows+1  
    for j = 1:targetCols-templateCols+1  
        % 提取目标图像中与模板大小相同的子图像  
        subImage = targetImage(i:i+templateRows-1, j:j+templateCols-1, :);  
          
        % 计算子图像与模板图像之间的绝对差值  
        diff =imabsdiff(subImage, templateImage);  
          
        % 计算方差和  
        sumDiff = sum(diff(:).^2);  
          
        % 如果和更小,则更新最小差值和位置  
        if sumDiff < minDiff  
            minDiff = sumDiff;  
            bestLoc = [i, j];  
        end  
    end  
end  
  
% 绘制绿色矩形框以显示定位结果  
figure;
subplot(1,3,1),imshow(targetImage);
title('目标图像');
subplot(1,3,2),imshow(templateImage);
title('模板图像');
subplot(1,3,3),imshow(targetImage);  
hold on;  
rectangle('Position', [bestLoc(2), bestLoc(1), templateCols, templateRows], 'EdgeColor', 'g', 'LineWidth', 0.5);  
title('匹配结果');  
hold off;
4.2 运行结果

图4-1 调整模板匹配结果

        这里放大模板匹配结果进行观察如图4-2所示:

图4-2 调整模板匹配结果局部放大图

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

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

相关文章

骁龙相机拍照流程分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 1.deliverInputEvent 拍照点击事件处理 2.submitRequestList Camera 提交拍照请求 3.createCaptureRequest 拍照请求帧数 骁龙相机通过binder 数据传输…

2006-2020上市公司研发投入金额数据集

2006-2020上市公司研发投入金额数据集https://download.csdn.net/download/a519573917/89501035 目录 上市公司研发投入与企业绩效的关系研究 一、引言 二、文献综述 三、研究设计 四、实证结果与分析 &#xff08;一&#xff09;描述性统计分析 &#xff08;二&#xf…

人工智能在肿瘤:分子亚型分类领域的最新研究进展|顶刊速递·24-07-01

小罗碎碎念 今日推文主题&#xff1a;人工智能在肿瘤/分子亚型分类中的应用 小罗观点 前两天有一位复旦的师兄私聊问了我一些问题&#xff0c;我看完以后觉得大家可能对于“分类”的概念有点不太熟悉&#xff0c;所以我决定写这篇推文系统的梳理一下“分类”和“回归”。 这俩都…

CleanMyMacX2024免费且强大的mac电脑系统优化工具

如果你的Mac电脑出现了存储空间不足、运行缓慢、电池电量消耗过快等问题&#xff0c;那么CleanMyMacX这款软件或许能为你提供解决方案。作为一款强大的系统优化工具&#xff0c;它能够帮助用户清理垃圾文件、优化内存和电池使用&#xff0c;从而提升Mac的性能表现&#xff0c;让…

09_计算机网络模型

目录 OSI/RM七层模型 OSI/RM七层模型 各层介绍及硬件设备 传输介质 TCP/IP协议簇 网络层协议 传输层协议 应用层协议 完整URL的组成 IP地址表示与计算 分类地址格式 子网划分和超网聚合 无分类编址 特殊含义的IP地址 IPv6协议 过渡技术 OSI/RM七层模型 OSI/RM七…

使用 Vue 实现包含单选框的弹窗功能(附Demo)

目录 前言1. Vue22. Vue3 前言 如果在弹窗中单独增设一些选项或者少部分的数据&#xff0c;可用如下的方式 &#xff08;不用单独创建专门的表单样式&#xff09; 如果单纯可以通过基本的按钮传输给后端&#xff0c;可用如下知识点 对于弹窗的基本知识推荐阅读&#xff1a; …

2024年06月CCF-GESP编程能力等级认证Scratch图形化编程四级真题解析

本文收录于《Scratch等级认证CCF-GESP图形化真题解析》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 一、单选题(共 10 题,每题 2 分,共 30 分) 第1题 小杨父母带他到某培训机构给他报名参加 CCF 组织的 GESP 认证考试的第 1 级,那他可以选择的认证语言有几…

数据资产铸就市场竞争优势:运用先进的数据分析技术,精准把握市场脉搏,构建独特的竞争优势,助力企业实现市场领先地位,赢得持续成功

目录 一、引言 二、数据资产的重要性 三、先进数据分析技术的应用 1、大数据分析技术 2、人工智能与机器学习 3、数据可视化技术 四、精准把握市场脉搏 1、深入了解客户需求 2、预测市场趋势 3、优化资源配置 五、构建独特的竞争优势 1、定制化产品和服务 2、精准营…

zerotier-one自建根服务器方法四

一、简介 前面几篇文章已经写完了安装配置服务器&#xff0c;今天写一下客户端如何连接自建的服务器。 二、准备工作 准备一个有公网IP的云主机。 要稳定性、安全性、不差钱的可以使用阿里、腾讯等大厂的云服务器。 本人穷屌丝一枚&#xff0c;所以我用的是免费的“三丰云…

Firefox 编译指南2024 Windows10-使用Git 管理您的Firefox(五)

1. 引言 在现代软件开发中&#xff0c;版本控制系统&#xff08;VCS&#xff09;是不可或缺的工具&#xff0c;它不仅帮助开发者有效管理代码的变化&#xff0c;还支持团队协作与项目管理。Mercurial 是一个高效且易用的分布式版本控制系统&#xff0c;其设计目标是简洁、快速…

【代码随想录】【算法训练营】【第53天】 [739]每日温度 [496]下一个更大元素I [503]下一个更大元素II

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 48&#xff0c;周六&#xff0c;不能再坚持~ 题目详情 [739] 每日温度 题目描述 739 每日温度 解题思路 前提&#xff1a; 思路&#xff1a; 重点&#xff1a; 代码实现 C语言 [496] 下一…

算法题型归类整理及同类题型解法思路总结(持续更新)

1、最优路线 通用思路 1、递归 #案例1-最优路测路线 题目描述 评估一个网络的信号质量&#xff0c;其中一个做法是将网络划分为栅格&#xff0c;然后对每个栅格的信号质量计算。 路测的时候&#xff0c;希望选择一条信号最好的路线&#xff08;彼此相连的栅格集合&#x…

Unity开箱即用的UGUI面板的拖拽移动功能

文章目录 &#x1f449;一、背景&#x1f449;二、效果图&#x1f449;三、原理&#x1f449;四、核心代码&#x1f449;五&#xff0c;总结 &#x1f449;一、背景 之前做PC项目时常常有面板拖拽移动的需求&#xff0c;今天总结封装一下&#xff0c;做成一个随时随地可复用的…

Linux 安装 Redis 教程

优质博文&#xff1a;IT-BLOG-CN 一、准备工作 配置gcc&#xff1a;安装Redis前需要配置gcc&#xff1a; yum install gcc如果配置gcc出现依赖包问题&#xff0c;在安装时提示需要的依赖包版本和本地版本不一致&#xff0c;本地版本过高&#xff0c;出现如下问题&#xff1a…

【PB案例学习笔记】-25制作一个带底图的MDI窗口

写在前面 这是PB案例学习笔记系列文章的第25篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

Linux CentOS 宝塔 Suhosin禁用php5.6版本eval函数详细图文教程

方法一&#xff1a;PHP_diseval_extension禁用 Linux CentOS 禁用php的eval函数详细图文教程_centos php 禁用 eval-CSDN博客 这个方法make报错&#xff0c;懒得费时间处理&#xff0c;直接用第二种 方法二&#xff1a;suhosin禁用 不支持PHP8&#xff0c;官方只支持PHP7以下…

SpringMVC基础详解

文章目录 一、SpringMVC简介1、什么是MVC2、MVC架构模式与三层模型的区别3、什么是SpringMVC 二、HelloWorld程序1、pom文件2、springmvc.xml3、配置web.xml文件4、html文件5、执行Controller 三、RequestMapping注解1、value属性1.1、基础使用1.2、Ant风格&#xff08;模糊匹配…

《Programming from the Ground Up》阅读笔记:p1-p18

《Programming from the Ground Up》学习第1天&#xff0c;p1-18总结&#xff0c;总计18页。 一、技术总结 1.fetch-execute cycle p9, The CPU reads in instructions from memory one at a time and executes them. This is known as the fetch-execute cycle。 2.genera…

企业化运维(6)_redis数据库

Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 redis是一个key-value存储系统。和Memcached类似&#xff0…

Vuetify3:关于两组件并列刷新变成两行并非一行问题,满足响应式

我们在使用vuetify3 开发站点的时候&#xff0c;我们需要两个组件并排&#xff0c;而且需要满足响应式&#xff1a; 那我们如何解决这个问题呢&#xff1f; 我们在开发的时候&#xff0c;一开始我们直接使用官方提供的弹性布局直接上代码&#xff1a; <template><v…