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

题目

给定图像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

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

猜你喜欢

转载自blog.csdn.net/weixin_66397563/article/details/131828519