1. 程式人生 > >LBP特徵Matlab和C實現

LBP特徵Matlab和C實現

LBP特徵成為區域性二值模式,具有旋轉不變性,不受光照影響
主要分為一下幾個步驟:
1.中心點鄰域內8個畫素,以中心點畫素值為閾值,鄰域內八個畫素值大於中心點畫素值即為1,小於中心點畫素值即為0
2.周圍八個畫素點形成一個八位的二進位制串比如11111111,即為255,00000000即為0,所以二進位制串再(0,255)範圍內
3.進行旋轉,從左上角開始,然後按順序進行旋轉,形成八個二進位制串,然後找出這個八個中的最小值代替中心點畫素值,因此具有旋轉不變性

Matlab程式碼如下:

function [LBPImage]=GetLBPImage(image)
	B=rgb2gray(image);
	[m,n]=size(B);
	X=[-1,0,1,1,1,0,-1,-1];%定義8個方向
	Y=[-1,-1,-1,0,1,1,1,0];
	prop=[];%屬性,是否大於中心點畫素值
	value=0;
	for i=2:m-1
	    for j=2:n-1
	        for k=1:8
	            y=i+Y(k);//新座標
	            x=j+X(k);
	            if B(i,j)>B(y,x)
	                prop(k)=0;%小於中心點即為0
	            else
	                prop(k)=1;%大於中心點即為1
	            end
	        end
	        for m=1:8
	            value=value+(2^(8-m))*prop(m);%計算新的畫素值
	        end
	        LBPImage(i,j)=value;
	        value=0;
	    end
	end
 

C語言程式碼:

在C語言中影象是陣列形式,引數為:輸入影象,LBP特徵圖

void CalculateLBPImage(X_UInt8 image[IMAGE_HEIGHT][IMAGE_WIDTH],X_UInt8 LBPImage[IMAGE_HEIGHT][IMAGE_WIDTH])
{
    int i,j,k;
    int x,y;
    int BinaryValue[8];
    int value;
    vector<int>LBPvalue;
    //定義八個方向
    int direction[8][2]={{-1,-1},{0,-
1},{1,-1},{1,0},{1,1},{0,1},{-1,1},{-1,0}}; for(i=1;i<IMAGE_HEIGHT-1;i++) { for(j =1;j<IMAGE_WIDTH-1;j++) { for(int k=0;k<8;k++) { x=j+direction[k][0];//周圍的座標 y=i+direction[k][1]; if(image[y][x]>
image[i][j]) { BinaryValue[k]=1; } else { BinaryValue[k]=0; } } for(int m=0;m<8;m++) { value+=BinaryValue[m]*(2^(7-m));//計算每一次旋轉之後的畫素值 } LBPImage[i][j]=value; } } }

原圖:
在這裡插入圖片描述
LBP影象:
在這裡插入圖片描述