C++OpenCV中如何實(shí)現(xiàn)擴(kuò)展LBP特征提取

這篇文章給大家分享的是有關(guān)C++ OpenCV中如何實(shí)現(xiàn)擴(kuò)展LBP特征提取的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名申請、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設(shè)、象山網(wǎng)站維護(hù)、網(wǎng)站推廣。

LBP的擴(kuò)展介紹

原始的LBP提出后,研究人員不斷對其提出了各種改進(jìn)和優(yōu)化。

圓形LBP算子

基本的LBP算子的最大缺陷在于它只覆蓋了一個(gè)固定半徑范圍內(nèi)的小區(qū)域,這顯然不能滿足不同尺寸和頻率紋理的需要。為了適應(yīng)不同尺度的紋理特征,并達(dá)到灰度和旋轉(zhuǎn)不變性的要求,Ojala等對 LBP 算子進(jìn)行了改進(jìn),將 3×3鄰域擴(kuò)展到任意鄰域,并用圓形鄰域代替了正方形鄰域,改進(jìn)后的 LBP 算子允許在半徑為 R 的圓形鄰域內(nèi)有任意多個(gè)像素點(diǎn)。從而得到了諸如半徑為R的圓形區(qū)域內(nèi)含有P個(gè)采樣點(diǎn)的LBP算子

C++ OpenCV中如何實(shí)現(xiàn)擴(kuò)展LBP特征提取

LBP均勻模式LBP (uniform LBP)

基本地LBP算子可以產(chǎn)生不同的二進(jìn)制模式,對于半徑為R的圓形區(qū)域內(nèi)含有P個(gè)采樣點(diǎn)的LBP算子將會產(chǎn)生P2種模式。很顯然,隨著鄰域集內(nèi)采樣點(diǎn)數(shù)的增加,二進(jìn)制模式的種類是急劇增加的。均勻模式就是一個(gè)二進(jìn)制序列從0到1或是從1到0的變過不超過2次(這個(gè)二進(jìn)制序列首尾相連)。比如:10100000的變化次數(shù)為3次所以不是一個(gè)uniform pattern。所有的8位二進(jìn)制數(shù)中共有58個(gè)uniform pattern.為什么要提出這么個(gè)uniform LBP呢,例如:5×5鄰域內(nèi)20個(gè)采樣點(diǎn),有2^20=1,048,576種二進(jìn)制模式。如此多的二值模式無論對于紋理的提取還是對于紋理的識別、分類及信息的存取都是不利的。同時(shí),過多的模式種類對于紋理的表達(dá)是不利的。例如,將LBP算子用于紋理分類或人臉識別時(shí),常采用LBP模式的統(tǒng)計(jì)直方圖來表達(dá)圖像的信息,而較多的模式種類將使得數(shù)據(jù)量過大,且直方圖過于稀疏。因此,需要對原始的LBP模式進(jìn)行降維,使得數(shù)據(jù)量減少的情況下能最好的代表圖像的信息。

為了解決二進(jìn)制模式過多的問題,提高統(tǒng)計(jì)性,Ojala提出了采用一種“等價(jià)模式”(Uniform Pattern)來對LBP算子的模式種類進(jìn)行降維。Ojala等認(rèn)為,在實(shí)際圖像中,絕大多數(shù)LBP模式最多只包含兩次從1到0或從0到1的跳變。因此,Ojala將“等價(jià)模式”定義為:當(dāng)某個(gè)LBP所對應(yīng)的循環(huán)二進(jìn)制數(shù)從0到1或從1到0最多有兩次跳變時(shí),該LBP所對應(yīng)的二進(jìn)制就稱為一個(gè)等價(jià)模式類。如00000000(0次跳變),00000111(只含一次從0到1的跳變),10001111(先由1跳到0,再由0跳到1,共兩次跳變)都是等價(jià)模式類。除等價(jià)模式類以外的模式都?xì)w為另一類,稱為混合模式類,例如10010111(共四次跳變)。通過這樣的改進(jìn),二進(jìn)制模式的種類大大減少,而不會丟失任何信息。模式數(shù)量由原來的2P種減少為 P ( P-1)+2種,其中P表示鄰域集內(nèi)的采樣點(diǎn)數(shù)。對于3×3鄰域內(nèi)8個(gè)采樣點(diǎn)來說,二進(jìn)制模式由原始的256種減少為58種,即:它把值分為59類,58個(gè)uniform pattern為一類,其它的所有值為第59類。這樣直方圖從原來的256維變成59維。這使得特征向量的維數(shù)更少,并且可以減少高頻噪聲帶來的影響。

旋轉(zhuǎn)不變模式LBP

旋轉(zhuǎn)不變模式LBP能夠在圖片發(fā)生一定的傾斜時(shí)也能得到相同的結(jié)果。它的定義可以看下(注:此圖來自于網(wǎng)絡(luò)):

C++ OpenCV中如何實(shí)現(xiàn)擴(kuò)展LBP特征提取

我們看到中心點(diǎn)的鄰居不再是它上下左右的8個(gè)點(diǎn)(補(bǔ)充一句,不一定非要是3*3的鄰域,這個(gè)自己定,但是鄰域大了意味著直方圖向量維度的增加),而是以它為圓心的一個(gè)圈,規(guī)定了這個(gè)圓的半徑和點(diǎn)的個(gè)數(shù),就可以求出各個(gè)點(diǎn)的坐標(biāo),但是點(diǎn)的坐標(biāo)不一定是整數(shù),如果是整數(shù)那么這個(gè)點(diǎn)的像素值就是對應(yīng)點(diǎn)的值,如果不是整數(shù),就用差值的方式得到。從 LBP 的定義可以看出,LBP 算子是灰度不變的,但卻不是旋轉(zhuǎn)不變的。圖像的旋轉(zhuǎn)就會得到不同的 LBP值。Maenpaa等人又將 LBP算子進(jìn)行了擴(kuò)展,提出了具有旋轉(zhuǎn)不變性的 LBP 算子,即不斷旋轉(zhuǎn)圓形鄰域得到一系列初始定義的 LBP值,取其最小值作為該鄰域的 LBP 值。

C++ OpenCV中如何實(shí)現(xiàn)擴(kuò)展LBP特征提取

如上圖所示(注:此圖來自于網(wǎng)絡(luò))給出了求取旋轉(zhuǎn)不變的 LBP 的過程示意圖,圖中算子下方的數(shù)字表示該算子對應(yīng)的 LBP值,圖中所示的 8 種 LBP模式,經(jīng)過旋轉(zhuǎn)不變的處理,最終得到的具有旋轉(zhuǎn)不變性的 LBP值為 15。也就是說,圖中的 8種 LBP 模式對應(yīng)的旋轉(zhuǎn)不變的 LBP模式都是 00001111。

上述介紹了幾種不同版本的LBP,對LBP特征向量進(jìn)行提取的步驟,如下所示:

  1. 將檢測窗口劃分為16×16的小區(qū)域(cell);

  2. 對于每個(gè)cell中的一個(gè)像素,將相鄰的8個(gè)像素的灰度值與其進(jìn)行比較,若周圍像素值大于中心像素值,則該像素點(diǎn)的位置被標(biāo)記為1,否則為0。這樣,3*3鄰域內(nèi)的8個(gè)點(diǎn)經(jīng)比較可產(chǎn)生8位二進(jìn)制數(shù),即得到該窗口中心像素點(diǎn)的LBP值;

  3. 然后計(jì)算每個(gè)cell的直方圖,即每個(gè)數(shù)字(假定是十進(jìn)制數(shù)LBP值)出現(xiàn)的頻率;然后對該直方圖進(jìn)行歸一化處理。

  4. 最后將得到的每個(gè)cell的統(tǒng)計(jì)直方圖進(jìn)行連接成為一個(gè)特征向量,也就是整幅圖的LBP紋理特征向量;

然后便可利用SVM或者其他機(jī)器學(xué)習(xí)算法進(jìn)行分類了。

代碼演示

接前面那個(gè)項(xiàng)目opencv-LBP,因?yàn)樵贓LBP里面演示用到了createtrackbar,需要加載函數(shù)進(jìn)來,所以我們把原來的Mat都移到了頂端,然后定義一下trackbar的基本屬性。

C++ OpenCV中如何實(shí)現(xiàn)擴(kuò)展LBP特征提取

然后在代碼下面加入創(chuàng)建trackbar的方法

C++ OpenCV中如何實(shí)現(xiàn)擴(kuò)展LBP特征提取

核心的方法ELBP_DEMO

C++ OpenCV中如何實(shí)現(xiàn)擴(kuò)展LBP特征提取

C++ OpenCV中如何實(shí)現(xiàn)擴(kuò)展LBP特征提取

C++ OpenCV中如何實(shí)現(xiàn)擴(kuò)展LBP特征提取

C++ OpenCV中如何實(shí)現(xiàn)擴(kuò)展LBP特征提取

然后我們運(yùn)行一下看看效果

C++ OpenCV中如何實(shí)現(xiàn)擴(kuò)展LBP特征提取

可以看到右邊默認(rèn)為3的效果,我們更改一下半徑值,看看分別不同的效果都是什么

C++ OpenCV中如何實(shí)現(xiàn)擴(kuò)展LBP特征提取

上圖是當(dāng)值為5時(shí)

C++ OpenCV中如何實(shí)現(xiàn)擴(kuò)展LBP特征提取

上圖是值為9時(shí)

C++ OpenCV中如何實(shí)現(xiàn)擴(kuò)展LBP特征提取

上圖為值為13時(shí)

C++ OpenCV中如何實(shí)現(xiàn)擴(kuò)展LBP特征提取

上圖為值為17時(shí)

可以看到,擴(kuò)展的LBP算法比基本的LBP特征提取的更為明顯一些。關(guān)鍵代碼里面的寫法不太好理解,我里面也有一知半解的東西,也是先做了后再研究吧。

感謝各位的閱讀!關(guān)于“C++ OpenCV中如何實(shí)現(xiàn)擴(kuò)展LBP特征提取”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

網(wǎng)頁題目:C++OpenCV中如何實(shí)現(xiàn)擴(kuò)展LBP特征提取
文章URL:http://muchs.cn/article0/gdcioo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、建站公司網(wǎng)站制作、網(wǎng)站設(shè)計(jì)外貿(mào)建站、網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)