【数字图像处理与应用】模板匹配
- 题目
- 模板匹配原理
- 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=−2M∑2Ml=−2N∑2Nf(x+k,y+l)⋅T(2M+k,2N+l)/k=−2M∑2Ml=−2N∑2Nf(x+k,y+l)2k=−2M∑2Ml=−2N∑2NT(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
声明:未经允许,请勿转载