圖像特征提取——局部二值模式(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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM