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

1 建模思路

1.图像预处理

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

2.获取模板大小

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

3.初始化差异矩阵

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

4.遍历目标图像

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

5.提取子图像

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

6.计算平方差之和

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

0630864197994d4f913bcb116a843be4.png

        其中,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 运行结果

fd0966a14f814b13a3efdb455e38906a.png

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

77d66c68e62f476ca79e0006ed09a807.png

图2-2 模板匹配结果

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

0f6af38612584e338556b560d76cf4f4.png

图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 运行结果

44bd1f94430e415caf99fb1726164a3e.png

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

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

8bb4c3b289a24d06b6c87c8bf1709399.png

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

 

 

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值