机器视觉----LBP

最近一直在做多视图的聚类与分裂,想要图片有更多的视图,就得对图片的特征进行抽取,那我们来聊聊图片的LBP特征。

Local binary patterns (局部二值模式),是机器视觉中重要的一种特征,它属于一个纹理问题。其核心是将各个元素与其他附近的像素进行比较,然后把结果保存为二进制数。LBP最重要的属性是对诸如光照变化等造成的灰度变化的鲁棒性。它的另外一个重要特性是它的计算简单,这使得它可以对图像进行实时分析。、

LBP算子的计算流程:

首先如下图1:每个点的像素值表示出来,如果比中心的点大或者等于则为1,小则为0.得到图2为:其中以这个3x3的矩阵最上面最左边第一个为1,然后顺时针依次变成2,4,8,16,32,64,125

图1                        图2                    图3

此处的LBP=1+16+32+64+128=251

以上就是传统LBP的计算过程。当然还有周围16个的,还有用圆去标注的。如下图:本质上的计算方法都一样,这里就不做赘述了。

Matlab实现:

function [ LBPHistogram ] = LBP( OrgIm,DoUniform)% if DoUniform = true -> return hisogram of 10 bin, if DoUniform = false -> return hisogram of 256 bin

 

Row=size(OrgIm,1);

Col=size(OrgIm,2);

 

for i=2:Row-1

for j=2:Col-1

Uniform = true;

MidPixelValue=OrgIm(i,j);

EncodedVec(1)=OrgIm(i-1,j-1)>MidPixelValue;

EncodedVec(2)=OrgIm(i-1,j)>MidPixelValue;

EncodedVec(3)=OrgIm(i-1,j+1)>MidPixelValue;

EncodedVec(4)=OrgIm(i,j+1)>MidPixelValue;

EncodedVec(5)=OrgIm(i+1,j+1)>MidPixelValue;

EncodedVec(6)=OrgIm(i+1,j)>MidPixelValue;

EncodedVec(7)=OrgIm(i+1,j-1)>MidPixelValue;

EncodedVec(8)=OrgIm(i,j-1)>MidPixelValue;

EncodedVecShift = circshift(EncodedVec,[0,1]);

if DoUniform

if sum(xor(EncodedVec,EncodedVecShift)) > 2 % more than 2 transition of 0 -> 1

Uniform = false;

LBPImage(i,j)=9;

end

end

if or(Uniform == true , DoUniform == false) % if LBP not uniform mode , or the texture is uniform -> 8 bits assign

MinLbp = EncodedVec(1)*2^7+EncodedVec(2)*2^6+EncodedVec(3)*2^5+EncodedVec(4)*2^4+EncodedVec(5)*2^3+EncodedVec(6)*2^2+EncodedVec(7)*2^1+EncodedVec(8)*2^0;

MinVector = EncodedVec;

for k = 1 : 7

EncodedVec = circshift(EncodedVec,[0,1]);

CurrLbpValue =EncodedVec(1)*2^7+EncodedVec(2)*2^6+EncodedVec(3)*2^5+EncodedVec(4)*2^4+EncodedVec(5)*2^3+EncodedVec(6)*2^2+EncodedVec(7)*2^1+EncodedVec(8)*2^0;

if CurrLbpValue < MinLbp

MinLbp = CurrLbpValue;

MinVector = EncodedVec;

end

end

LBPImage(i,j)=MinVector(1)*2^7+MinVector(2)*2^6+MinVector(3)*2^5+MinVector(4)*2^4+MinVector(5)*2^3+MinVector(6)*2^2+MinVector(7)*2^1+MinVector(8)*2^0;

end

end

end

if DoUniform

LBPImage(LBPImage ~=9) = log2(LBPImage(LBPImage ~=9)+1);

LBPHistogram=zeros(1,10);

for i =1:size(LBPImage,1)

for k = 1:size(LBPImage,2)

LBPHistogram(1,LBPImage(i,k)+1)=LBPHistogram(1,LBPImage(i,k)+1)+1;

end

end

else

LBPHistogram=zeros(1,256);

for i =1:size(LBPImage,1)

for k = 1:size(LBPImage,2)

LBPHistogram(1,LBPImage(i,k)+1)=LBPHistogram(1,LBPImage(i,k)+1)+1;

end

end

end

 

end

posted @ 2017-01-12 14:56  刘岩--  阅读(1348)  评论(0编辑  收藏  举报