1. 程式人生 > >區域性二值模式LBP-簡單人臉識別(三)

區域性二值模式LBP-簡單人臉識別(三)

一)區域性二值模式簡介

前面介紹過關於主成分分析法的識別方法,這個方法是選取的整幅影象的主成分分量來作為新的特徵,從某種意義上說這是一種基於全域性特徵的方法。但是一般影象識別中,僅僅使用全域性特徵是不夠的,獲得的識別率較低,更多的時候,表徵一副影象的特徵也缺少不了區域性特徵。那麼區域性二值模式(LBP)就是這樣一種表徵區域性特徵的方法。

介紹性原理的文章很多,這裡貼個較好的:

研究該演算法的過程中還發現了一篇較好的碩士論文:

基於LBP的人臉識別研究_黃非非

想深入瞭解的可以看看。

一)經典LBP特徵提取的程式實現

   

在介紹實現之前請一定要看上述的那篇部落格,那個裡面有相關的介紹原理,看了這個原理才能知道演算法的實現過程。這裡也是介紹經典的矩形3*3領域實現方法。

從上述原理可以知道,要得到影象中的每個畫素點的LBP值,必須和它的領域有關,所以它的四周必須得有畫素點,這就出現了一個問題,對於一個影象邊緣畫素點來說怎麼辦?它是邊緣點,那麼必定存在著它的3*3領域內的某幾個點超出影象之外,也就是沒有畫素值,這樣會出現錯誤的,那麼一個解決辦法就是對原影象進行畫素擴充套件,也就是把原影象的四周向外擴充套件一下,畫素點的灰度擴充套件成多少?可以是把邊界點的畫素複製過去就可以了(當然還有其他方法),知道影象濾波的可能會知道,在濾波演算法中也存在著邊界點的處理過程,本質上方法是一樣的。

考慮到是3*3的矩形領域,那麼四周邊界點只需要向外擴充套件一行或者一列就行了。如果矩形框改變大小,那麼向外擴充套件的大小也改變。簡單的擴充套件描述過程如下:


把相應的位置複製到新的擴充套件圖中就可以了。

從原理中看到某個畫素點的LBP值得計算公式可以簡單描述為:


其中,2^p的係數可以用矩陣代替:C = [1,2,4;128,0,8;64,32,16];

求和可以用矩陣的點乘來代替並求和。矩陣點乘就是矩陣對應位置與對應位置相乘,和矩陣直接相乘還是有很大的區別。

有了上述分析,程式可以寫成如下:

%--------------函式說明-------------  
%-----LBP:Local Binary Patterns,區域性二值模式
%-----輸入:img原始灰度影象:注意圖片為double型
%-----輸出:該影象的的LBP特徵
%-----------------------------------  
function LBP = Lbp_Img(img)
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[m,n] = size(img);%取大小
r = 1;
img_extend = zeros(m+2*r,n+2*r);%規定擴充套件後的矩陣大小並賦值0
img_extend(r+1:m+r,r+1:n+r) = img;%中間部分複製
img_extend(1:r,r+1:n+r) = img(1:r,1:n);%上擴充套件
img_extend(1:m+r,n+r+1:n+2*r) = img_extend(1:m+r,n+1:n+r);%右擴充套件
img_extend(m+r+1:m+2*r,r+1:n+2*r) = img_extend(m+1:m+r,r+1:n+2*r);%下擴充套件
img_extend(1:m+2*r,1:r) = img_extend(1:m+2*r,r+1:r+1:2*r);%左擴充套件

%%
C = [1,2,4;128,0,8;64,32,16]; %矩陣點乘的權值矩陣
LBP = zeros(m,n);
for i=1:m   %對所有的畫素點
    for j=1:n
        temp = img(i,j);   %取得該點畫素值--也就是中心值
        temp_mat = ones(3)*temp;  %檢測得鄰域矩陣3*3
        temp_ext = img_extend(i+r-1:i+r+1,j+r-1:j+r+1);%取得鄰域矩陣畫素點
        temp_mean = temp_ext - temp_mat;  %相差
        temp_mean(find(temp_mean>=0)) = 1; %判斷,置0與1
        temp_mean(find(temp_mean<0)) = 0;
        LBP(i,j) = sum(sum(C.*temp_mean));   %點乘並求和返回LBP
    end
end


二):樣本圖片的LBP提取與直方圖顯示:

現在對一副影象進行提取整個影象的LBP,很顯然一幅影象的LBP必定是與原影象相同大小的矩陣才對。現在我們隨意找來一副影象進行提取LBP


首先轉化成灰度影象,並進行double型轉換,最後直接執行

LBP = Lbp_Img(img);imshow(LBP,[])

如下(注意imshow函式在顯示的時候加上[],使其自適應顯示,不然顯示不出來這個圖):


LBP演算法的一大優點就是對光照具有較強的魯棒性,現在人為用matlab改變一下樣本的原始亮度,再顯示他們的LBP如下所示:


可以看到在亮度不同的條件下他們的LBP基本上沒有多大變化。

那麼怎麼去進行後續處理呢?一個很重要的處理方法就是對LBP進行灰度直方圖處理,在直方圖的基礎上進一步處理。

對上述得到的LBPmatlab本身自帶直方圖統計與顯示函式hist,但是它只能處理一行或者一列的資料,所以對LBP這種矩陣首先得進行處理成一行再來運用,這裡我們又可以運用reshape函數了。處理與顯示如下:

>> [m,n] = size(LBP);

data = reshape(LBP,1,m*n);

hist(data,255);

[nel,cen] = hist(data,255);

統計直方圖如下所示:


還有一個我們關心的數字就是上述的nel,這是每個畫素點的LBP中的總統計個數,而cen是中心點,其實就是1~255(所有灰度值)。nel這個1*n的資料在後面的處理時至關重要。