- 數字圖像處理高級應用:基于MATLAB與CUDA的實現(第2版) (精通MATLAB)
- 趙小川
- 1130字
- 2020-11-28 22:33:13
1.2 從向量相關角度實現圖像匹配
1.2.1 基于相關運算圖像匹配的過程
基于相關運算的圖像匹配技術可以直接用于在一幅圖像中尋找某個子圖,并確定子圖的位置。對于大小為M×N的圖像f(x,y)和大小為J ×K的子圖模板w(x,y),f(x,y)與w(x,y)的相關運算可以表示為:

其中,x=1,2, …,N-K+1,y=1,2, …,M-J+1。子圖模板w(x,y)的原點設置在子圖像的左上角。
計算相關c(x,y)的過程就是在圖像f(x,y)中逐點地移動子圖像w(x,y),使w(x,y)的原點和圖像f(x,y)中點(x,y)重合,然后計算w(x,y)與f(x,y)中被w(x,y)覆蓋的圖像區域對應像素的乘積之和,以此計算結果作為相關圖像c(x,y)在點(x,y)處的響應。
相關可用于在圖像f(x,y)中找到與子圖像w(x,y)匹配的所有位置。實際上,當w(x,y)按照上述描述的過程移過整幅圖像f(x,y)之后,最大的響應點(x0,y0)即為最佳匹配的左上角點。也可以設定一個閾值T,認為響應值大于該閾值點的均是可能匹配的位置。
1.2.2 在向量空間分析圖像相關匹配
相關的計算是通過將圖像元素和子模式圖像元素聯系起來獲得的,將相關元素相乘后再累加。完全可以將子圖像w(x,y)視為一個按行或按列存儲的向量,將計算過程中被w(x,y)覆蓋的圖像區域視為另一個按照同樣方式存儲的向量
。這樣一來,相關運算就成了向量之間的點積運算。
兩個向量的點積為:

其中,θ為向量、
之間的夾角。顯然,當
和
具有完全相同的方向(平行)時,cosθ=1,從而式(1.2.1)取得其最大值
,這就意味著當圖像的局部區域類似于子圖像模式時,相關運算產生最大的響應。然而,式(1.2.1)最終的取值還與
、
自身的模有關,這將導致式(1.2.1)計算的相關響應存在著對f(x,y)和w(x,y)的灰度幅值比較敏感的缺陷。這樣一來,在f(x,y)的高灰度區,可能其內容與子圖像w(x,y)的內容并不相近,但由于
自身較大而產生一個很高的響應。可通過對向量以其模值來歸一化解決這個問題,即通過式(1.2.2)來計算。

1.2.3 基于向量相關的圖像匹配的MATLAB實現
【例1.2.1】 實現基于向量相關的圖像匹配。
********************************************************************* function Icorr= imcorr(I, w) % 功能:實現基于向量相關的圖像匹配 % 輸入:I——輸入的圖像 % w——模板圖像 % 輸出:Icoor——相關系數矩陣 if nargin~= 2 %檢查輸入的個數是否正確 error('請輸入兩幅圖像 ') end if size(I,3)== 3 %檢查圖像是否是灰度圖像,如果是RGB圖像,則將其 %轉換成灰度圖像
I = rgb2gray(I); end if size(w,3)== 3 w = rgb2gray(w); end [m, n]=size(I); [m0, n0]=size(w); Icoor=zeros(m-m0+1, n-n0+1); %為相關系數圖像分配空間,以提高運算效率 vecW=double(w(:)); %按列存儲為向量 normW=norm(vecW); %對應的向量模 for ii=1:m-m0+1 for jj=1:n-n0+1 subMat=I(ii:ii+m0-1, jj:jj+n0-1); vec=double(subMat(:)); %按列存儲為向量 Icorr(ii, jj)=vec'*vecW/(norm(vec)*normW+eps); %計算當前位置的相關系數 end end %找出最大響應位置 [iMaxRes, jMaxRes]=find(Icorr==max(Icorr(:))); figure, imshow(I) hold on for ii=1:length(iMaxRes) plot(jMaxRes(ii), iMaxRes(ii), '* '); %用矩形框標記出匹配區域 plot([jMaxRes(ii), jMaxRes(ii)+n0-1], [iMaxRes(ii), iMaxRes(ii)]); plot([jMaxRes(ii)+n0-1, jMaxRes(ii)+n0-1], [iMaxRes(ii), iMaxRes(ii)+m0-1]); plot([jMaxRes(ii), jMaxRes(ii)+n0-1], [iMaxRes(ii)+m0-1, iMaxRes(ii)+m0-1]); plot([jMaxRes(ii), jMaxRes(ii)], [iMaxRes(ii), iMaxRes(ii)+m0-1]); *********************************************************************