一、原理及概述
韋伯局部描述符(WLD)是一種魯棒性好、簡單高效的局部特征描述符。WLD由兩個部分組成:差分激勵和梯度方向。
其具體算法是對于給定的一幅圖像,通過對每個像素進行這兩個分量的計算來提取其差分激勵圖像和梯度方向圖像,并將這兩部分組合成一個二維直方圖,進而轉化為一個一維直方圖,最后利用一維直方圖進行分類。[1]
?
差分激勵:差分激勵時某像素領域值和減去8倍中心像素值的結果與該像素點的比值。顯然,這反映了當前像素點與領域像素點之間的差異。
在對差分激勵有了一個概念性的認識以后,我們來看數學表述:
?
綜合上述公式,我們整合一下:
通過計算式子,我們知道如果Garctan>0,則表明領域像素的亮度大于當前像素;反之,則表明當前像素在該區域內的亮度較低。
在計算過程中,為了避免出現輸入值過大或過小的情況從而造成不可控的局面,可以通過一個函數將其映射到一個合理范圍之內。常用的是sigmoid函數、arctan函數以及對數函數。sigmoid函數如下:
由于考慮到sigmoid函數的計算量較大,所以往往可以選用arctan函數。
?
梯度方向:通過計算局部窗內水平方向和垂直方向像素插值之比的反正切變換得到[1]。梯度方向反映的是局部窗內灰度變化的空間分布信息。
以下為梯度方向的數學表述,注意,xi在下面一張圖里。
為了更加有效地區分灰度窗內灰度變化的分布情況,,我們需要將其擴展到[0,2pi)。設映射f:,有:
最后,需要對其量化,計算過程如下:
?
直方圖:在圖像中利用直方圖表示灰度分布。在此處,直方圖是用于局部描述算子的變量之一。
我們在得到了差分激勵與梯度方向以后,可以得到兩幅新的圖像:差分激勵圖像和梯度方向圖像,從而可以得到二維WLD直方圖。其中,N為圖像的維度,T為方向域的分段個數,每一小塊都對應一個差分激勵和梯度方向。
為便于分類,,需要將二維直方圖轉化為一維直方圖。整個過程如下圖所示,其實我的理解就是,一行一行的排列,(就像在C里,二維數組其實是個一維數組一樣,只是他是一行一行的讀取罷了)
?
?
? 綜合:了解了這幾個基本信息以后,我們來看一張圖,好詳細理解WLD算子:
對于差分激勵來講,v00,v01,我們知道他是可以看作上圖中的濾波算子,同理,v10,v11也是如此。我們通過分別計算完差分激勵與梯度方向后,得到有關二者的二維直方圖,最后將二維直方圖一維化,即為WLD算子的全部操作。
?二、代碼及其結果
以下為WLD算子的代碼:
image=imread('lena.jpg'); image=rgb2gray(image); d_image=double(image); [xsize ysize] = size(d_image); EPSILON=0.0000001; numNeighbors=8; d_differential_excitation = zeros(xsize-1,ysize-1); d_gradient_orientation = zeros(xsize-1,ysize-1);%計算WLD for x = 2:xsize-1for y = 2:ysize-1% 計算差勵v00=d_image(x-1,y-1)+d_image(x,y-1)+d_image(x+1,y-1)+d_image(x-1,y)+d_image(x+1,y)+d_image(x-1,y+1)+d_image(x,y+1)+d_image(x+1,y+1)-8*d_image(x,y);v01=d_image(x,y);if ( v01 ~= 0 )d_differential_excitation(x,y)=atan(v00/v01);elsed_differential_excitation(x,y)=0;end% 計算梯度方向N2=d_image(x,y-1); N6=d_image(x,y+1);N4=d_image(x+1,y); N0=d_image(x-1,y);if ( abs(N0-N4) < EPSILON) d_gradient_orientation(x,y) = 0;elsev10=N6-N2; v11=N0-N4;d_gradient_orientation(x,y) = atan(v11/v10);% 映射至0-2pi之間%角度轉化為數值 && 梯度方向的量化d_gradient_orientation(x,y)=d_gradient_orientation(x,y)*180/pi;if (v11 > EPSILON && v10 > EPSILON) d_gradient_orientation(x,y)= d_gradient_orientation(x,y)+ 180; else if (v11 < -EPSILON && v10 > EPSILON) d_gradient_orientation(x,y)= d_gradient_orientation(x,y)+ 180; else if (v11 < -EPSILON && v10 < -EPSILON) d_gradient_orientation(x,y)= d_gradient_orientation(x,y); else if (v11 > EPSILON && v10 < -EPSILON) d_gradient_orientation(x,y)= d_gradient_orientation(x,y)+ 360; endendendendendend end % 對梯度方向值與差勵進行量化 % 將差勵6等分,梯度8等分 %reshape函數重新調整矩陣的行數、列數、維數。下為將所有元素展現為一列 d_differential_excitation_one = reshape(d_differential_excitation,[size(d_differential_excitation,1)*size(d_differential_excitation,2),1]); d_gradient_orientation_one = reshape(d_gradient_orientation,[size(d_gradient_orientation,1)*size(d_gradient_orientation,2),1]); % figure; %直方圖,指定柱狀數量為6 H_dif = histogram(d_differential_excitation_one,6); dif_edge=H_dif.BinEdges; % figure; H_gra = histogram(d_gradient_orientation_one,8); gra_edge=H_gra.BinEdges; % count 兩個矩陣的像素點的直方圖歸到6*8矩陣 %循環實現計數功能,即每一節直方圖的出現的像素點的個數 histNumbers = zeros(6,8); for i=1:length(d_differential_excitation_one)temp1 = d_differential_excitation_one(i);temp2 = d_gradient_orientation_one(i);for k = 2:length(dif_edge)if temp1 <= dif_edge(k)g1 = k-1;break;endendfor k = 2:length(gra_edge)if temp2 <= gra_edge(k)g2 = k-1;break;endendhistNumbers(g1,g2) = histNumbers(g1,g2)+1; end%figure(111);%bar3(histNumbers'); mid_dif=[];%二維直方圖的完善 for i=1:length(dif_edge)-1temp = (dif_edge(i)+dif_edge(i+1))/2;temp = round(temp*100)/100;mid_dif = [mid_dif,temp]; end set(gca, 'XTickLabel',{num2str(mid_dif(1)),num2str(mid_dif(2)),num2str(mid_dif(3)),num2str(mid_dif(4)),num2str(mid_dif(5)),num2str(mid_dif(6))}); mid_gra=[]; for i=1:length(gra_edge)-1temp = (gra_edge(i)+gra_edge(i+1))/2;temp = round(temp*100)/100;temp = temp*2*pi/360;mid_gra = [mid_gra,temp]; endbarhang=[]; for i=1:size(histNumbers,1)barhang=[barhang,histNumbers(i,:)]; end % bar(barhang); % % 繪圖 figure(123); subplot(2,2,1),imshow(d_differential_excitation,[]); title('差勵') image_DE = (255* (d_differential_excitation - (-pi/2))/((pi/2)-(-pi/2))); subplot(2,2,2),imshow(mat2gray(uint8(image_DE)));title('差勵歸到[0,255]') subplot(2,2,3),imshow(d_gradient_orientation,[]); title('梯度方向') image_DO = (255* (d_gradient_orientation - (-pi/2))/((pi/2)-(-pi/2))); subplot(2,2,4),imshow(mat2gray(uint8(image_DO)));title('梯度方向歸到[0,255]')
結果如下:
差分激勵和梯度方向的兩幅圖像分別顯示如下:
一維直方圖效果為:
?
參考文獻;
[1]李思.復雜光照下圖像特征提取.(D).西安:長安大學,2018.
?
2019-05-09
17:41:41
?
?