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