生活随笔
收集整理的這篇文章主要介紹了
LBP(local binary pattern)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
LBP(local binary pattern)是一種用來描述圖像局部紋理特征的算子。原始的LBP于1994年提出,它反映內容是每個像素與周圍像素的關系。后被不斷的改進和優化,分別提出了LBP旋轉不變模式、LBP均勻模式等。
一:原始的LBP
?? 給出一個簡單的案例計算LBP:如下圖,周圍8個像素點比中間點像素值大(或者相等)的記為1,小的記為0,這樣就得到二值圖,然后按順時針方向得到二進制串10001111
這樣中間點的像素值就用241來代替。注意這里的計算LBP的順序并沒有硬性要求,只是一個量化公式,在同一處理中保持相同的順序即可。
下面給出LBP的計算公式:
二、旋轉不變的LBP模式<LBPROT>
原始的LBP不具有旋轉不變性,這樣我們就提出了旋轉不變的LBP模式。旋轉不變的LBP計算公式如下:
這樣計算出來的LBP共有36種,分布情況如下面兩幅圖:
其中白點代表1,黑點代表0。
三:均勻LBP模式
旋轉LBP模式同樣存在缺陷,大量的實驗證明LBP模式的36種情況在一幅圖像中分布出現的頻率差異較大,得到的效果并不是很好。因此人們提出了均勻LBP模式即uniform LBP。
均勻模式就是一個二進制序列從0到1或是從1到0的變過不超過2次(這個二進制序列首尾相連)。比如:10100000的變化次數為3次所以不是一個uniform pattern。所有的8位二進制數中共有58(變化次數為0的有2種,變化次數為1的有0種,變化次數為2的有56種)個uniform pattern.為什么要提出這么個uniform LBP呢,因為研究者發現他們計算出來的大部分值都在這58種之中,可達到90%以上,所以他們把值分為59類,58個uniform pattern為一類,其它的所有值為第59類。59=(2+0+56)+1,這樣直方圖從原來的256維變成59維。起到了降維的作用。
?計算公式:
應用:
在模式識別如判斷兩幅圖片的相似性時,我們可以統計這兩幅圖像的LBP特征的直方圖。這樣,在原始的LBP模式中,統計的直方圖可以當做一個256維的向量。直接這樣判斷,很多時候會因為“位置沒有對準”而產生很大的誤差。大量研究表明,此時我們可以將一幅圖片劃分為若干的子區域,對每個子區域內的每個像素點都提取LBP特征,然后,在每個子區域內建立LBP特征的統計直方圖。如此一來,每個子區域,就可以用一個統計直方圖來進行描述;整個圖片就由若干個統計直方圖組成。比如將一幅圖像劃分為10*10個區域,這樣得到向量的維數就是256*10*10。而針對uniform LBP,此時向量的維數就是59*10*10, 從而達到降維的目的。
目前,LBP局部紋理提取算子,已經成功應用在指紋識別、字符識別、人臉識別、車牌識別等領域。
Code:
原始的LBP:
[cpp]?view plaincopy
void?LBP(Mat?&image,?Mat?&result)?? {?? ????for(int?y?=?1;?y?<?image.rows-1;?y?++)?? ????{?? ????????for(int?x?=?1;?x?<?image.cols-1;?x++)?? ????????{?? ????????????uchar?neighbor[8]?=?{0};?? ????????????neighbor[0]?=?image.at<uchar>(y-1,?x-1);?? ????????????neighbor[1]?=?image.at<uchar>(y-1,?x);?? ????????????neighbor[2]?=?image.at<uchar>(y-1,?x+1);?? ????????????neighbor[3]?=?image.at<uchar>(y,?x+1);?? ????????????neighbor[4]?=?image.at<uchar>(y+1,?x+1);?? ????????????neighbor[5]?=?image.at<uchar>(y+1,?x);?? ????????????neighbor[6]?=?image.at<uchar>(y+1,?x-1);?? ????????????neighbor[7]?=?image.at<uchar>(y,?x-1);?? ????????????uchar?center?=?image.at<uchar>(y,?x);?? ????????????uchar?temp?=?0;?? ????????????for(int?k?=?0;?k?<?8;?k++)?? ????????????{?? ????????????????temp?+=?(neighbor[k]?>=?center)*?(1<<k);???? ????????????}?? ????????????result.at<uchar>(y,x)?=?temp;??? ????????}?? ????}?? }?? ?? int?main()?? {?? ????Mat?image?=?imread("F:\\lena.png",?0);?? ????if(!image.data)?? ????{?? ????????cout?<<?"Fail?to?load?image"?<<?endl;?? ????????return?0;?? ????}?? ????Mat?result;?? ????result.create(Size(image.cols,?image.rows),?image.type());?? ????LBP(image,?result);?? ????namedWindow("result",?0);?? ????imshow("result",?result);?? ????waitKey(0);?? ????return?0;?? }??
uniform LBP:
[cpp]?view plaincopy
?? int?getHopCount(int?i)?? {?? ????int?a[8]?=?{0};?? ????int?cnt?=?0;?? ????int?k?=?7;?? ????while(i)?? ????{?? ????????a[k]?=?i&1;?? ????????i?=?i?>>?1;?? ????????--k;?? ????}?? ????for(k?=?0;?k?<?7;?k++)?? ????{?? ????????if(a[k]?!=?a[k+1])?? ????????{?? ????????????++cnt;?? ????????}?? ????}?? ????if(a[0]?!=?a[7])?? ????{?? ????????++cnt;?? ????}?? ????return?cnt;?? }?? ?? ?? void?lbp59table(uchar?*table)?? {?? ????memset(table,?0,?256);?? ????uchar?temp?=?1;?? ????for(int?i?=?0;?i?<?256;?i++)?? ????{?? ????????if(getHopCount(i)?<=?2)?????? ????????{?? ????????????table[i]?=?temp;?? ????????????temp?++;?? ????????}?? ????}?? }?? ?? void?uniformLBP(Mat?&image,?Mat?&result,?uchar?*table)?? {?? ????for(int?y?=?1;?y?<?image.rows-1;?y?++)?? ????{?? ????????for(int?x?=?1;?x?<?image.cols-1;?x++)?? ????????{?? ????????????uchar?neighbor[8]?=?{0};?? ????????????neighbor[0]?=?image.at<uchar>(y-1,?x-1);?? ????????????neighbor[1]?=?image.at<uchar>(y-1,?x);?? ????????????neighbor[2]?=?image.at<uchar>(y-1,?x+1);?? ????????????neighbor[3]?=?image.at<uchar>(y,?x+1);?? ????????????neighbor[4]?=?image.at<uchar>(y+1,?x+1);?? ????????????neighbor[5]?=?image.at<uchar>(y+1,?x);?? ????????????neighbor[6]?=?image.at<uchar>(y+1,?x-1);?? ????????????neighbor[7]?=?image.at<uchar>(y,?x-1);?? ????????????uchar?center?=?image.at<uchar>(y,?x);?? ????????????uchar?temp?=?0;?? ????????????for(int?k?=?0;?k?<?8;?k++)?? ????????????{?? ????????????????temp?+=?(neighbor[k]?>=?center)*?(1<<k);???? ????????????}?? ????????????result.at<uchar>(y,x)?=?table[temp];????? ????????}?? ????}?? }?? ?? int?main()?? {?? ????uchar?table[256];?? ????lbp59table(table);?? ????Mat?image?=?imread("F:\\lena.png",?0);?? ????if(!image.data)?? ????{?? ????????cout?<<?"Fail?to?load?image"?<<?endl;?? ????????return?0;?? ????}?? ????Mat?result;?? ????result.create(Size(image.cols,?image.rows),?image.type());?? ????uniformLBP(image,?result,?table);?? ?? ????namedWindow("uniformResult",?0);?? ????imshow("uniformResult",?result);?? ?? ????waitKey(0);?? ????return?0;?? ?????? }??
Result:
原圖:
原始LBP:
uniform LBP:
總結
以上是生活随笔為你收集整理的LBP(local binary pattern)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。