图像特征提取——局部二值模式(LBP)、局部三值模式(LTP)

一、LBP算子

  局部二值模式是一种灰度范围内的非参数描述子,具有对灰度变化不敏感且计算速度快等优点[1].LBP算子利用中心像素的领域像素与中心像素的比较结果进行编码。常见的LBPP,R模式有:

   P,R分别代表领域像素点的个数和领域半径,上图所示分别为8点半径为1;16点半径为2;8点半径为2的模式。

  LBP算子计算实例如下:从左上角开始,沿顺时针方向依次与中心像素进行比较,如果大于等于中心像素的取值为1,否则为0.得到一个01序列,我们视为一个二进制数。将二进制数转化为十进制数即可。

  LBP算子的数学表述如下:

  以下,我们根据实例来编写代码:

clear all;
clc;
img=imread('lena.jpg');
img=rgb2gray(img);
[m,n]=size(img);
imgn=zeros(m,n);
for i=2:m-1
   for j=2:n-1 
        for p=i-1:i+1
            for q =j-1:j+1
                if img(p,q) > img(i,j)||img(p,q) ==img(i,j)
                    if p~=i || q~=j  
                        if(p==i&&q==j-1)                   
                            imgn(i,j)=imgn(i,j)+2^0;
                        end
                        if(p==i+1&&q==j-1)                
                            imgn(i,j)=imgn(i,j)+2^1;
                        end
                        if(p==i+1&&q==j)                 
                            imgn(i,j)=imgn(i,j)+2^2;
                        end
                        if(p==i+1&&q==j+1)                    
                             imgn(i,j)=imgn(i,j)+2^3;
                        end
                        if(p==i&&q==j+1)                    
                            imgn(i,j)=imgn(i,j)+2^4;
                        end
                        if(p==i-1&&q==j+1)                    
                            imgn(i,j)=imgn(i,j)+2^5;
                        end
                        if(p==i-1&&q==j)                    
                            imgn(i,j)=imgn(i,j)+2^6;
                        end
                        if(p==i-1&&q==j-1)                    
                            imgn(i,j)=imgn(i,j)+2^7;
                        end
                    end
                end
            end
        end 
   end
end
figure;subplot(1,2,1),imshow(img),title('原图');
subplot(1,2,2),imshow(imgn,[]),title('LBP');

  代码输出结果如下:

二、旋转不变LBP算子

  在LGS算子里,我们提到,这一类算子虽然在刻画领域相对明暗时非常有效,但是一旦图像发生旋转,则立即失效。与LGS算子不同的是,LBP算子中的P个位于同一个圆上,我们单纯考虑算子的图形时,算子每转过360/P度时,图形都能与原来重合,这是LGS算子难以做到。所以我们也因此就引入了旋转不变LBP算子。

  我们考虑酒桌上转盘上的菜,我们知道无论转盘如何旋转,转盘上的菜品相对位置都是不变的。也就是说,如果我们将眼前的菜按顺时针标记为0123456789。在他旋转的过程中,我们总能在桌子前的某一位置按照0123456789确定这一桌菜确实就是我所参与饭局的这一桌菜。

  我们回来考虑图像,旋转不变性,我们也只需要考虑算子在旋转过程中是否满足某一准则。正如我们说到的酒桌的例子一样。对于一个8点LBP算子而言,经过不同角度的旋转,我们最终会有8个序列组成的二进制数,也就是说能产生8个十进制数,如果我们以最小的那个二进制数为标记,经过旋转,大于它的LBP算子我们一律以最小值来考虑,经过旋转,但得到的算子结果是一样的。这样就能克服旋转带来的变化。

   其数学表达为:

三、局部三值模式

  在LBP算子的基础之上,三值模式非常好理解。

  即把原来非1即0的情况,改成了1,0,-1的情况。

  与LBP算子不同的是,由于引入了-1,会出现负数的情况,所以在三值模式下,算子分程一正一负进行编码。

  由于中心像素作为阈值的存在,使得LTP算子具有更好的光照鲁棒性,能提升其鉴别能力。

  代码如下:

img=imread('lena.jpg');
img=rgb2gray(img);
t=5;
img=double(img);
[m n]=size(img);
imgn_upper=zeros(m,n);%初始化结果矩阵(正值)
imgn_lower=zeros(m,n);%初始化结果矩阵(负值)
for i=2:m-1
   for j=2:n-1 
        for p=i-1:i+1%遍历周边像素
            for q =j-1:j+1
                if p~=i || q~=j  %不取目标像素
                        %%%正值提取结果
                     if (img(p,q) - img(i,j))>t||(img(p,q) - img(i,j))==t
                        if(p==i&&q==j-1)                   
                           imgn_upper(i,j)=imgn_upper(i,j)+2^0;
                        end
                        if(p==i+1&&q==j-1)                
                           imgn_upper(i,j)=imgn_upper(i,j)+2^1;
                        end
                       
                        if(p==i+1&&q==j)                 
                           imgn_upper(i,j)=imgn_upper(i,j)+2^2;
                        end
                        if(p==i+1&&q==j+1)                    
                           imgn_upper(i,j)=imgn_upper(i,j)+2^3;
                        end
                        if(p==i&&q==j+1)                    
                           imgn_upper(i,j)=imgn_upper(i,j)+2^4;
                        end
                        if(p==i-1&&q==j+1)                    
                           imgn_upper(i,j)=imgn_upper(i,j)+2^5;
                        end
                        if(p==i-1&&q==j)                    
                           imgn_upper(i,j)=imgn_upper(i,j)+2^6;
                        end
                        if(p==i-1&&q==j-1)                    
                           imgn_upper(i,j)=imgn_upper(i,j)+2^7;
                        end
                      %%%负值提取结果
                     elseif (img(p,q) - img(i,j))<-t||(img(p,q) - img(i,j))==-t
                        if(p==i&&q==j-1)                   
                            imgn_lower(i,j)=imgn_lower(i,j)+2^0;
                        end
                        if(p==i+1&&q==j-1)                
                            imgn_lower(i,j)=imgn_lower(i,j)+2^1;
                        end
                        if(p==i+1&&q==j)                 
                            imgn_lower(i,j)=imgn_lower(i,j)+2^2;
                        end
                        if(p==i+1&&q==j+1)                    
                            imgn_lower(i,j)=imgn_lower(i,j)+2^3;
                        end
                        if(p==i&&q==j+1)                    
                            imgn_lower(i,j)=imgn_lower(i,j)+2^4;
                        end
                        if(p==i-1&&q==j+1)                    
                            imgn_lower(i,j)=imgn_lower(i,j)+2^5;
                        end
                        if(p==i-1&&q==j)                    
                            imgn_lower(i,j)=imgn_lower(i,j)+2^6;
                        end
                        if(p==i-1&&q==j-1)                    
                            imgn_lower(i,j)=imgn_lower(i,j)+2^7;
                        end
                     end
                 end 
            end
        end
   end
end
subplot(1,2,1),imshow(imgn_upper,[]),title('LTP正值提取');
subplot(1,2,2),imshow(imgn_lower,[]),title('LTP负值提取');

  代码输出结果:

参考文献;

[1]李思.复杂光照下图像特征提取.(D).西安:长安大学,2018.

2019-05-08

17:32:43

原文地址:https://www.cnblogs.com/lyxyhhxbk/p/10816863.html