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图像: