图像特征提取——局部二值模式(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
标签:LBP,end,imgn,img,upper,局部,模式,&&,算子 来源: https://www.cnblogs.com/lyxyhhxbk/p/10816863.html