zoukankan      html  css  js  c++  java
  • 图像特征提取——局部二值模式(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

  • 相关阅读:
    SharePoint的安装配置
    onkeypress与onkeydown及 oncopy和onpaste 事件区别详细说明
    sql Server 的基本函数
    iOS 错误 之 http请求
    iOS 错误及解决汇总
    iOS 开源库 之 AFNetWorking 2.x
    linux 下 tomcat 之 配置静态资源路径
    iOS 之 Block Variable
    iOS 协议
    #import与@class的区别
  • 原文地址:https://www.cnblogs.com/lyxyhhxbk/p/10816863.html
Copyright © 2011-2022 走看看