一、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