本篇文章仅为本人加深图像处理算法的理解,有不严谨的地方,不作为学习的参考。 参考书籍:精通Matlab数字图像处理与识别,张铮等,人民邮电出版社。
局部二进制模式(LBP),最早用于图像纹理的描述,其在描述局部区域的特征方面有着卓越的能力。
1.理论基础
图像多为分区图像,标准的LBP直方图的维数较高,且局部直方图过于稀疏。基于此提出统一化模式的概念。 统一化模式:二进制串***循环***变化的次数小于等于2.大于2的为非统一化模式。 每个统一化模式占一个收集箱,非统一化模式统一占一个收集箱。如8邻域,收集箱的个数为:2+0+56+1=59. 分为: 1.统一化LBP算子,即Uniform LBP,如
L
B
P
8
,
2
u
2
LBP_{8,2}^{u2}
LBP8,2u2,表示邻域为8,半径为2. 2.多块的LBP算子,即Multi-Block LBP算子,可以描述图像的粗粒度。通常用符号
M
B
S
−
L
B
P
8
,
2
u
2
MB_{S}-LBP_{8,2}^{u2}
MBS−LBP8,2u2表示,块大小为
S
×
S
S\times S
S×S的
L
B
P
8
,
2
u
2
LBP_{8,2}^{u2}
LBP8,2u2。 3.分区的多块LBP算子。先将图像分区,再求各分区的MB-LBP,将直方图聚合。
2.程序结构
生成映射表:根据邻域,计算二进制串,判断二进制串为统一化模式还是非统一化模式,将其分别放在相应的收集箱。 计算图像LBP特征:首先计算各采样点的像素值,不在中心点的像素值,通常采用双线性插值,拟合得到。计算得到LBP响应的图像灰度;得到LBP直方图。
3.统一化LBP算子matlab程序实现
3.1生成映射表
function vecmapping=getmapping1(sp);
%生成映射表
% sp为采样点个数
cnt=sp;
bits=zeros(1,8);
vecmapping=zeros(1,256);
ibcnt=1;
for i=0:255
num=i;
icnt=0;
while(num)
bits(cnt-icnt)=mod(num,2);
num=floor(num/2);
icnt=icnt+1;
end
if IsUniform(bits)
vecmapping(i+1)=ibcnt;
ibcnt=ibcnt+1;
else
vecmapping(i+1)=59;
end
end
save('LBPmapping.mat','vecmapping');
function result = IsUniform( bits )
n=length(bits);
njump=0;
for i=1:n-1
if bits(i)~=bits(i+1);
njump=njump+1;
end
end
if bits(n)~=bits(1);
njump=njump+1;
end
if njump>2
result=false;
else
result=true;
end
3.2 得到图像的LBP81
function histLBP = getimageLBP( B,r )
%LBP81
load 'LBPmapping.mat';
image=B;
[m,n]=size(image);
if (m<=2*r) || (n<=2*r)
error('image is too small');
end
imageLBP=zeros(m-2*r,n-2*r);
image_LBP=zeros(1,8);
histLBP=zeros(1,59);
for i=1+r:m-r
for j=1+r:n-r
ncn=1;
image_LBP(ncn)=image(i,j-r);
ncn=ncn+1;
value1=image(i-1,j-1)+0.2929*(image(i-1,j)-image(i-1,j-1));
value2=image(i,j-1)+0.2929*(image(i,j)-image(i,j-1));
value=value1+0.2929*(value2-value1);
image_LBP(ncn)=value;
ncn=ncn+1;
image_LBP(ncn)=image(i-1,j);
ncn=ncn+1;
value1=image(i-1,j)+0.7071*(image(i-1,j+1)-image(i-1,j));
value2=image(i,j)+0.7071*(image(i,j+1)-image(i,j));
value=value1+0.2929*(value2-value1);
image_LBP(ncn)=value;
ncn=ncn+1;
image_LBP(ncn)=image(i,j+1);
ncn=ncn+1;
value1=image(i+1,j)+0.7071*(image(i+1,j+1)-image(i+1,j));
value2=image(i,j)+0.7071*(image(i,j+1)-image(i,j));
value=value1+0.2929*(value2-value1);
image_LBP(ncn)=value;
ncn=ncn+1;
image_LBP(ncn)=image(i+1,j);
ncn=ncn+1;
value1=image(i+1,j-1)+0.2929*(image(i+1,j)-image(i+1,j-1));
value2=image(i,j-1)+0.2929*(image(i,j)-image(i,j-1));
value=value1+0.2929*(value2-value1);
image_LBP(ncn)=value;
for i1=1:ncn
if image_LBP(i1)>=image(i,j)
imageLBP(i-r,j-r)=imageLBP(i-r,j-r)+2^(ncn-i1);
end
end
end
end
for i2=1:m-2*r
for j2=1:n-2*r
histLBP(vecmapping(imageLBP(i2,j2)+1))= histLBP(vecmapping(imageLBP(i2,j2)+1))+1;
end
end
end