日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LBP(local binary pattern)

發布時間:2025/4/16 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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。

均勻模式就是一個二進制序列從01或是從10的變過不超過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);??//?計算LBP的值??
  • ????????????}??
  • ????????????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;??
  • }??
  • ??
  • //?降維數組?由256->59??
  • void?lbp59table(uchar?*table)??
  • {??
  • ????memset(table,?0,?256);??
  • ????uchar?temp?=?1;??
  • ????for(int?i?=?0;?i?<?256;?i++)??
  • ????{??
  • ????????if(getHopCount(i)?<=?2)????//?跳變次數<=2?的為非0值??
  • ????????{??
  • ????????????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);??//?計算LBP的值??
  • ????????????}??
  • ????????????result.at<uchar>(y,x)?=?table[temp];???//??降為59維空間??
  • ????????}??
  • ????}??
  • }??
  • ??
  • 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。