應用背景:機器的模式識別所要解決的問題,就是用機器代替人去認識圖像和找出一幅圖像中人們感興趣的目標物。如何找到目標物即圖像的區域呢,這裏介紹在空間域使用模板在圖像中尋找與模板匹配的區域。
基本原理:在空間濾波中,相關是指濾波器模板移過圖像並計算每個像素位置的灰度乘積之和的過程。基於相關的圖像模板匹配過程類似於濾波過程,設圖像f(x,y)的大小爲M*N和模板子圖像w(x,y)的大小爲J*K,則f與w的相關表示爲:
(1)
其中,x=0,1,2,3.....N-K,y=0,1,2.....M-J,計算相關c(x,y) 的過程就是在圖像f(x,y) 中逐像素地移動模板子圖像w(x,y) 的原點像素,在每一次移動的過程中根據式(1)計算每個像素位置的相關。對式(1)的向量表達式進行歸一化後如下式所示:
(2)
MATLAB實現如下:
clear;
reource_p=imread('F:\picture\pattern.bmp');
reource_p_sub=imread('F:\picture\sub_pattern.bmp');
[m,n]=size(reource_p);
[m0,n0]=size(reource_p_sub);
result=zeros(m-m0+1,n-n0+1);
vec_sub = double( reource_p_sub(:) );
norm_sub = norm( vec_sub );
for i=1:m-m0+1
for j=1:n-n0+1
subMatr=reource_p(i:i+m0-1,j:j+n0-1);
vec=double( subMatr(:) );
result(i,j)=vec'*vec_sub / (norm(vec)*norm_sub+eps);
end
end
%找到最大相關位置
[iMaxPos,jMaxPos]=find( result==max( result(:)));
figure,
subplot(121);imshow(reource_p_sub),title('匹配模板子圖像');
subplot(122);
imshow(reource_p);
title('標記出匹配區域的原圖'),
hold on
plot(jMaxPos,iMaxPos,'*');%繪製最大相關點
%用矩形框標記出匹配區域
plot([jMaxPos,jMaxPos+n0-1],[iMaxPos,iMaxPos]);
plot([jMaxPos+n0-1,jMaxPos+n0-1],[iMaxPos,iMaxPos+m0-1]);
plot([jMaxPos,jMaxPos+n0-1],[iMaxPos+m0-1,iMaxPos+m0-1]);
plot([jMaxPos,jMaxPos],[iMaxPos,iMaxPos+m0-1]);
運行結果如下圖所示