LBP特征提取原理和python库代码
1局部二值模式
? ? ? ?局部二值模式(?Local?binary?pattern,?LBP?)圖作為-?-?種傳統的表情提取特征的方法,有著不可替代的優勢。在1994?年被Ojala等人首次提出并作出定義計算。他最大的特點就是當圖像數據中的灰度值不易被影響而發生改變,同時,對圖像數據進行轉向操作而不影響表情特征的提取。該方法的過程共分三步,如圖
1將圖像中的某一一個像素點及其周圍的8鄰域像素點組合在一-起,?定義為一個3x3的窗口。
2以該像素點的灰度值也就是窗口中心點的灰度值作為閾值,與其周圍8鄰域像素點的灰度值依次進行比較,8鄰域像素點灰度值中大于闕值的位置被置為1,小于閾值的位置被置為0。
3將經過(2)步驟得到的二進制數按照順時針或者逆時針旋轉的順序排列起來(圖中采用的是順時針旋轉的方式),將得到的結果從二進制轉為十進制,此時得到的值就是該方法獲取的特征值。
? ? ? 上述公式中,中心像素點的定位由LBP,來決定,P?確定的是相鄰區域的像素點的數量,p提供的是相鄰區域中排在P位置的像素點,g,確定了所有范圍內在中心點周圍其他區域的點的灰度值,g指的是所有范圍內的中心點的灰度值,s(x)返回參數的正負號。
? ? ? 由上述的原始LBP算子計算過程不難看出,其并不具備旋轉不變性的優點,換句話來說就是當圖像發生旋轉時,原始LBP算子也會發生改變。因為當圖像發生旋轉時,其紋理及形狀卻并不會因此發生變化,所以這是不被期望產生的情況。因此,為了解決原始LBP算子的這種局限性問題,Ojala及其團隊又提出了改進的圓形LBP算子。圓形LBP算子結構如圖2.4所示,相比于原始LBP算子來說,圓形LBP算子是將圖像中某--像素點與其周圍任意半徑大小的圓形領域上的像素點組合在一-起定義的一個圓形領域。而在圓形鄰域上會存在若千個像素點,因此,這里需要對圓形鄰域進行采樣,假設這個圓形鄰域的半徑大小為R,那么通過采樣得到的鄰域像素點數量為P,這,樣就構成了該像素點的圓形LBP算子。之后將執行與原始LBP算子運算過程中的(2)(3)兩個步驟相同的操作,即可得到由圓形LBP算子計算得出的LBP特征值。然而,在這里還有一-?個小問題,在對圓形鄰域進行采樣的過程中,并不是所有的采樣坐標都一定會剛好落在像素點上,為了解決這一-?問題,將采用雙線性插值來對這些沒有落在像素上的領域值進行估計。
?
? ? ? ?為了使這種圓形LBP算子具備旋轉不變性的優點,Ojala?及其團隊為其算法增加了-步與原始LBP算子計算過程不同的操作,即將圓形LBP算子進行-系列的旋轉操作,這樣就可以得到一系列不同的LBP特征值,將這些LBP特征值中的最小值作為該圓形LBP算子計算得出的LBP特征值。
? ? ? ? 圖2.5展示的是LBP算子具有數據旋轉但特征值能保持不變的特性,其中白色圓圈表示1,黑色圓圈表示0,因此通過計算原循環LBP算子表示的二進制數為1100001也就是十進制下的225。經過不斷旋轉后發現該圓形LBP算子擁有8種旋轉角度,分別對應8種LBP特征值,經過比較,選取最小的LBP特征值15作為該圓形LBP算子的LBP特征值。
? ? ? ?通過上述LBP算子的計算過程可以看出,原始LBP的特征模式每次有2的8次方種可能,而圓形LBP的特征模式每次有2"種可能,因此,不難發現,LBP?的特征模式數量隨著不斷地改進而呈現爆炸性的指數增長,而過多的特征值數量不僅會增加計算量,而且還可能影響計算效率。針對這一-問題,?Ojala?及其團隊又提出了一種既能夠大幅減低特征維度又能夠盡量保留圖像信息的等價模式。這種模式的理論基礎是他們研究發現,圖像數據的二進制值一般只會發生兩次變化,且二進制只包括0和1,因此根據這種特征定義了與LBP模式相似的模式類,且這種類中包含最多兩次的數據改變。當實驗采用了該模式后,原始LBP特征模式的數量降低為58種,圓形LBP特征模式的數量降低為Px(P-1)+2種。
?LBP特征向量進行提取的步驟:
(1)首先將檢測窗口劃分為16×16的小區域(cell);
(2)對于每個cell中的一個像素,將相鄰的8個像素的灰度值與其進行比較,若周圍像素值大于中心像素值,則該像素點的位置被標記為1,否則為0。這樣,3*3鄰域內的8個點經比較可產生8位二進制數,即得到該窗口中心像素點的LBP值;
(3)然后計算每個cell的直方圖,即每個數字(假定是十進制數LBP值)出現的頻率;然后對該直方圖進行歸一化處理。
(4)最后將得到的每個cell的統計直方圖進行連接成為一個特征向量,也就是整幅圖的LBP紋理特征向量;
然后便可利用SVM或者其他機器學習算法進行分類了。參考一些博客中的代碼實現效果如下:
? ??
local_binary_pattern參數詳解:
local_binary_pattern(image, P, R, method='default')
參數(調參)
image:(N,M)陣列灰度圖像。(只能是灰度圖)
P:int圓對稱鄰居設置點的數量(角度空間的量化)。
R:float圓的半徑(操作員空間分辨率)。
method:{‘default’,‘ror’,‘uniform’,‘var’}確定模式的方法(調參使用)
?
返回值:
輸出:(N,M)陣列LBP圖像
np.histogram()解釋:
np.histogram()是一個生成直方圖的函數 histogram(a,bins=10,range=None,weights=None,density=False);a是待統計數據的數組;bins指定統計的區間個數;range是一個長度為2的元組,表示統計范圍的最小值和最大值,默認值None,表示范圍由數據的范圍決定weights為數組的每個元素指定了權值,histogram()會對區間中數組所對應的權值進行求和density為True時,返回每個區間的概率密度;為False,返回每個區間中元素的個數a = np.random.rand(100) hist,bins = np.histogram(a,bins=5,range=(0,1)) print(hist) print(bins) [19 30 15 16 20] [ 0. 0.3 0.4 0.6 0.9 1. ]
?
總結
以上是生活随笔為你收集整理的LBP特征提取原理和python库代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 集成海康威视Sadp SDK实现设备激活
- 下一篇: 帅瞎了!手机也能写Python代码!手把