机器视觉----LBP

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

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

LBP算子的计算流程:

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

机器视觉----LBP机器视觉----LBP机器视觉----LBP

图1                        图2                    图3

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

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

机器视觉----LBP

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

上一篇:【总结】STL--map


下一篇:使用js主函数的原因是等文档加载完了才给里面的元素添加东西 如果不使用主函数则文档加载时候无法找到元素则不能成功给元素添加事件