1. 程式人生 > >數字影象處理——相關檢測

數字影象處理——相關檢測

原理:利用模板與影象做相關運算得到相關值矩陣,相關值最大的位置即檢測出的目標位置。相關值計算公式:

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

測試影象:

待檢測影象
模板

 

執行結果: