给定图像car.png和模版图像wheel.png,利用相关检测实现对car图像中的wheel检测,具有最大相关值的位置可以解释为所检测到的wheel位置。程序的输入是图像和模版,要求:
(i)显示图像的相关值结果;
(ii)列出在图像中检测到的所有目标的(x,y)坐标。
% 读取原图像和模板图像
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);
% 读取原图像和模板图像
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
声明:未经允许,请勿转载