原理:利用模板与图像做相关运算得到相关值矩阵,相关值最大的位置即检测出的目标位置。相关值计算公式:
Matlab代码:
clear,clc;
car = imread('car.png');
mask = imread('wheel.png');
[h1,w1] = size(car);
[h2,w2] = size(mask);
car_ext = zeros(h1+h2-1,w1+w2-1); % car_ext为对car进行边缘补零后的图像
h2_2 = floor(h2/2); % 模板的半高
w2_2 = floor(w2/2); % 模板的半宽
m1 = h2_2+1; % 原图像car在边缘补零后的图像car_ext中的起始行位置
m2 = h2_2+h1;
n1 = w2_2+1; % 原图像car在边缘补零后的图像car_ext中的起始列位置
n2 = w2_2+w1;
car_ext(m1:m2,n1:n2) = car;
g = zeros(h1+h2-1,w1+w2-1); % g记录相关值
m = zeros(h1+h2-1,w1+w2-1); % 模板
% 滑动窗口进行相关滤波
for i = m1:m2
for j = n1:n2
sum1 = 0;
sum2 = 0;
m(i-h2_2:i+h2_2,j-w2_2:j+w2_2) = mask;
for u = i-h2_2:i+h2_2
for v = j-w2_2:j+w2_2
sum1 = sum1+car_ext(u,v)*m(u,v); % 模板和原图像对应位置相乘后累加
sum2 = sum2+car_ext(u,v)^2; % sum2为图像内容
end
end
g(i,j) = sum1/sum2; % sum2对sum1进行调整,避免检测出错
end
end
g = g(m1:m2,n1:n2); % 相关值矩阵去除边缘的0
g = im2uint8(mat2gray(r));
tmp = max(g(:)); % 找出相关值矩阵的最大值
[y,x] = find(g==tmp); % 找出最大值的坐标
figure,imshow(car);
figure,imshow(g);
测试图像:
模板:
运行结果: