2016年9月12日 星期一

使用OCTAVE來實踐基本形的LBP (Local Binary Pattern)


Local Binary Patterns 縮寫成LBP,姑且翻譯成區域二元樣式。LBP廣泛應用在圖形識別上,尤其人臉識別。今天利用Octave (Matlab)來撰寫程式,完成基本形的LBP。LBP有很多種變形,最基本的LBP就是對每一個影像點,與其相鄰的八個鄰居比較大小,得到長度為八的二元數字(換算成十進位就是0-255之間的數值),再統計所有影像點的二元數字得到一個histogram(直方圖)就是LBP。


用一個小例子來解釋:

↓(a)是一個3x3的小影像,中心點為190;190的八個鄰居與其比較大小,比中心點小的設為0,其餘為1得到(b);從左上角開始,順時鐘取得比較結果,得到長度為八的二元數字10110001 ,其十進位就是177。

由於每個影像點需利用其八個鄰居來計算LBP, 所以鄰居少於八個的就不列入考慮,也就是影像中最上一排、最下一排、最左一排及最右一排的影像點不會計算其LBP。

------ 開始寫程式 -------
由於只考慮八個鄰居的基本形LBP,可以利用Octave的特性寫一個簡單的雛形,程式如下:


im : 輸入的灰度影像
imC:輸入影像中需要計算的部份,也就是去除im最上下左右一排;imC中的每一個像素都要與八個鄰居比較,計求其十進位值。
imout:結果影像,初始值為0;尺寸與imC一樣
im1~im8:尺寸與imC相同,起始坐標即是8鄰居的相對位置(順時鐘)
imB=im1>=imC:imC中的每一個像素與其左上方像素比較,結果儲存在imB
imout = imout + 128*imB:二元數字轉換成十進位數
imB=im2>=imC:imC中的每一個像素與其上方像素比較,結果儲在imB
imout = imout + 64*imB:二元數字轉換成十進位數
....
imB=im8>=imC:imC中的每一個像素與其左方像素比較,結果儲在imB
imout = imout + 1*imB:二元數字轉換成十進位數

實際執行一遍...


↑A是亂數產生的8x8矩陣,其值介於0-255,LBP(A)得到一個6x6矩陣



↑上圖顯示其中一點的計算過程

這程式看起來有點呆呆的, 不過比較容易理解。如果想要把它寫得「有學問」,可以將八個鄰居坐標存在陣列中,再用for  loop來完成。最後要提醒的是,上面的程式輸出結果是一個LBP影像(除了最外一圈,所有像素都求其LBP編碼),並非histogram。可以利用imhist就可馬上得到LBP影像的histogram,練習一下:

↑讀取影像存在im, 藉由我們寫的程式LBP求得LBP影像imLBP,再由imhist把histogram存在LBPhist中,也就是LBPhist是一個一維陣列。最後繪出影像LENA及其LBP 直方圖。


--  END --

沒有留言:

張貼留言