数字图像处理——相关检测

原理:利用模板与图像做相关运算得到相关值矩阵,相关值最大的位置即检测出的目标位置。相关值计算公式:

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);

测试图像:

待检测图像
模板

运行结果:

猜你喜欢

转载自blog.csdn.net/Lee_01/article/details/81056016