【图像识别】基于LBP+LPQ算法融合人脸表情识别【Matlab 433期】

一、简介

LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子;它具有旋转不变性和灰度不变性等显著的优点。它是首先由T. Ojala, M.Pietikäinen, 和D. Harwood 在1994年提出,用于纹理特征提取。而且,提取的特征是图像的局部的纹理特征;

1、LBP特征的描述
  原始的LBP算子定义为在33的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,33邻域内的8个点经比较可产生8位二进制数(通常转换为十进制数即LBP码,共256种),即得到该窗口中心像素点的LBP值,并用这个值来反映该区域的纹理信息。如下图所示:
【图像识别】基于LBP+LPQ算法融合人脸表情识别【Matlab 433期】_第1张图片
LBP的改进版本:
  原始的LBP提出后,研究人员不断对其提出了各种改进和优化。

(1)圆形LBP算子:
  基本的 LBP 算子的最大缺陷在于它只覆盖了一个固定半径范围内的小区域,这显然不能满足不同尺寸和频率纹理的需要。为了适应不同尺度的纹理特征,并达到灰度和旋转不变性的要求,Ojala 等对 LBP 算子进行了改进,将 3×3 邻域扩展到任意邻域,并用圆形邻域代替了正方形邻域,改进后的 LBP 算子允许在半径为 R 的圆形邻域内有任意多个像素点。从而得到了诸如半径为R的圆形区域内含有P个采样点的LBP算子;
【图像识别】基于LBP+LPQ算法融合人脸表情识别【Matlab 433期】_第2张图片
(2)LBP旋转不变模式
  从 LBP 的定义可以看出,LBP 算子是灰度不变的,但却不是旋转不变的。图像的旋转就会得到不同的 LBP值。
  Maenpaa等人又将 LBP 算子进行了扩展,提出了具有旋转不变性的 LBP 算子,即不断旋转圆形邻域得到一系列初始定义的 LBP 值,取其最小值作为该邻域的 LBP 值。
  图 2.5 给出了求取旋转不变的 LBP 的过程示意图,图中算子下方的数字表示该算子对应的 LBP 值,图中所示的 8 种 LBP模式,经过旋转不变的处理,最终得到的具有旋转不变性的 LBP 值为 15。也就是说,图中的 8 种 LBP 模式对应的旋转不变的 LBP 模式都是00001111。
【图像识别】基于LBP+LPQ算法融合人脸表情识别【Matlab 433期】_第3张图片
(3)LBP等价模式
 一个LBP算子可以产生不同的二进制模式,对于半径为R的圆形区域内含有P个采样点的LBP算子将会产生2P2P种模式。很显然,随着邻域集内采样点数的增加,二进制模式的种类是急剧增加的。例如:5×5邻域内20个采样点,有220220=1,048,576种二进制模式。如此多的二值模式无论对于纹理的提取还是对于纹理的识别、分类及信息的存取都是不利的。同时,过多的模式种类对于纹理的表达是不利的。例如,将LBP算子用于纹理分类或人脸识别时,常采用LBP模式的统计直方图来表达图像的信息,而较多的模式种类将使得数据量过大,且直方图过于稀疏。因此,需要对原始的LBP模式进行降维,使得数据量减少的情况下能最好的代表图像的信息。
  为了解决二进制模式过多的问题,提高统计性,Ojala提出了采用一种“等价模式”(Uniform Pattern)来对LBP算子的模式种类进行降维。Ojala等认为,在实际图像中,绝大多数LBP模式最多只包含两次从1到0或从0到1的跳变。因此,Ojala将“等价模式”定义为:当某个LBP所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该LBP所对应的二进制就称为一个等价模式类。如00000000(0次跳变),00000111(只含一次从0到1的跳变),10001111(先由1跳到0,再由0跳到1,共两次跳变)都是等价模式类。除等价模式类以外的模式都归为另一类,称为混合模式类,例如10010111(共四次跳变)(这是我的个人理解,不知道对不对)。
  通过这样的改进,二进制模式的种类大大减少,而不会丢失任何信息。模式数量由原来的2P2P种减少为 P ( P-1)+2种,其中P表示邻域集内的采样点数。对于3×3邻域内8个采样点来说,二进制模式由原始的256种减少为58种,这使得特征向量的维数更少,并且可以减少高频噪声带来的影响。
2、LBP特征用于检测的原理
显而易见的是,上述提取的LBP算子在每个像素点都可以得到一个LBP“编码”,那么,对一幅图像(记录的是每个像素点的灰度值)提取其原始的LBP算子之后,得到的原始LBP特征依然是“一幅图片”(记录的是每个像素点的LBP值)。
【图像识别】基于LBP+LPQ算法融合人脸表情识别【Matlab 433期】_第4张图片
从上图可以看出LBP对光照具有很强的鲁棒性
  LBP的应用中,如纹理分类、人脸分析等,一般都不将LBP图谱作为特征向量用于分类识别,而是采用LBP特征谱的统计直方图作为特征向量用于分类识别。
  因为,从上面的分析我们可以看出,这个“特征”跟位置信息是紧密相关的。直接对两幅图片提取这种“特征”,并进行判别分析的话,会因为“位置没有对准”而产生很大的误差。后来,研究人员发现,可以将一幅图片划分为若干的子区域,对每个子区域内的每个像素点都提取LBP特征,然后,在每个子区域内建立LBP特征的统计直方图。如此一来,每个子区域,就可以用一个统计直方图来进行描述;整个图片就由若干个统计直方图组成;
  例如:一幅100100像素大小的图片,划分为1010=100个子区域(可以通过多种方式来划分区域),每个子区域的大小为1010像素;在每个子区域内的每个像素点,提取其LBP特征,然后,建立统计直方图;这样,这幅图片就有1010个子区域,也就有了1010个统计直方图,利用这1010个统计直方图,就可以描述这幅图片了。之后,我们利用各种相似性度量函数,就可以判断两幅图像之间的相似性了;
3、对LBP特征向量进行提取的步骤
  (1)首先将检测窗口划分为16×16的小区域(cell);
  (2)对于每个cell中的一个像素,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3*3邻域内的8个点经比较可产生8位二进制数,即得到该窗口中心像素点的LBP值;
  (3)然后计算每个cell的直方图,即每个数字(假定是十进制数LBP值)出现的频率;然后对该直方图进行归一化处理。
  (4)最后将得到的每个cell的统计直方图进行连接成为一个特征向量,也就是整幅图的LBP纹理特征向量;
  然后便可利用SVM或者其他机器学习算法进行分类了。

LPQ(Local Phase Quantization)算法的原理是假设平滑函数h(x)中心对称,则其傅里叶变换为H(u),对所有H(u)≥0有∠G(u)= ∠F(u),其中F(u)和G(u)分别为原图像和平滑后图像的傅里叶变换,因而在H(u)≥0条件下,图像对平滑有不变性。

为使H(u)≥0,a取为不超过第一个过零点的频率点,其值为a=1/winSize(winSize为输入参数)。分别用f(x)对u1=(a,0),u2=(0,a),u3=(a,a),u4=(a,-a)四个点作STFT,然后分别把四个点的实部和虚部分开,形成一个向量W=[Re{F(u1,x)},Re{F(u2,x)},Re{F(u3,x)},Re{F(u4,x)},Im{F(u1,x)},Im{F(u2,x)},Im{F(u3,x)},Im{F(u4,x)}]T 。

最终得到LPQ变换即为Fx=W*fx。然后对参数进行统计分析,若参数是相关的,则用奇异值分解去相关并且量化。

二、源代码

 %日期:2013/7/3
 %首先对jaffe表情图片进行LPB+LPQ特征提取,最后放入支持向量机中分类训练,统计出训练和测试的精度
clc
clear
c=[];
addpath train;
addpath test;
mapping=getmapping(8,'u2');%LBP映射
        W=[2,1,1,1,1,1,2; ...
          2,4,4,1,4,4,2; ...
          1,1,1,0,1,1,1; ...
          0,1,1,0,1,1,0; ...
          0,1,1,1,1,1,0; ...
          0,1,1,2,1,1,0; ...
          0,1,1,1,1,1,0]; 
%提取SU表情的特征
for i=1:20
  B=imread(strcat('train\','SU\',num2str(i),'.tiff'));  %读取SU类别的表情照片
  X = double(B);
  X = imresize(X,[128 128],'bilinear');  %采用'bilinear':采用双线性插值算法扩展为128*128
  H2=DSLBP(X,mapping,W);%提取图片的LBP直方图
  Gray=X;
  Gray=(Gray-mean(Gray(:)))/std(Gray(:))*20+128;
  lpqhist=lpq(Gray,3,1,1,'nh');       %计算每个照片lpq直方图 
  a=[H2,lpqhist];
  c=[c;a];%LPB和LPQ特征融合
  disp(sprintf('完成SU表情第%i张图片的特征提取',i));
end
%%%以下注释一样
%提取SA表情的特征
for i=1:21     
  B=imread(strcat('train\','SA\',num2str(i),'.tiff'));  
   X = double(B);
  X = imresize(X,[128 128],'bilinear');  %采用'bilinear':采用双线性插值算法扩展为128*128
  H2=DSLBP(X,mapping,W);%提取图片的LBP直方图
  Gray=X;
  Gray=(Gray-mean(Gray(:)))/std(Gray(:))*20+128;
  lpqhist=lpq(Gray,3,1,1,'nh');       %计算每个照片lpq直方图 
  a=[H2,lpqhist];
  c=[c;a];%LPB和LPQ特征融合
  disp(sprintf('完成SA表情第%i张图片的特征提取',i));
end
%提取NE表情的特征
for i=1:20
  B=imread(strcat('train\','NE\',num2str(i),'.tiff'));
    X = double(B);
  X = imresize(X,[128 128],'bilinear');  %采用'bilinear':采用双线性插值算法扩展为128*128
  H2=DSLBP(X,mapping,W);%提取图片的LBP直方图
  Gray=X;
  Gray=(Gray-mean(Gray(:)))/std(Gray(:))*20+128;
  lpqhist=lpq(Gray,3,1,1,'nh');       %计算每个照片lpq直方图 
  a=[H2,lpqhist];
  c=[c;a];
  disp(sprintf('完成NE表情第%i张图片的小波特征提取',i));
end
for i=1:22
  B=imread(strcat('train\','HA\',num2str(i),'.tiff'));
   X = double(B);
  X = imresize(X,[128 128],'bilinear');  %采用'bilinear':采用双线性插值算法扩展为128*128
  H2=DSLBP(X,mapping,W);%提取图片的LBP直方图
  Gray=X;
  Gray=(Gray-mean(Gray(:)))/std(Gray(:))*20+128;
  lpqhist=lpq(Gray,3,1,1,'nh');       %计算每个照片lpq直方图 
  a=[H2,lpqhist];
  c=[c;a];%LPB和LPQ特征融合
  disp(sprintf('完成HA表情第%i张图片的小波特征提取',i));
end
for i=1:22
  B=imread(strcat('train\','FE\',num2str(i),'.tiff'));
    X = double(B);
  X = imresize(X,[128 128],'bilinear');  %采用'bilinear':采用双线性插值算法扩展为128*128
  H2=DSLBP(X,mapping,W);%提取图片的LBP直方图
  Gray=X;
  Gray=(Gray-mean(Gray(:)))/std(Gray(:))*20+128;
  lpqhist=lpq(Gray,3,1,1,'nh');       %计算每个照片lpq直方图 
  a=[H2,lpqhist];
  c=[c;a];
  disp(sprintf('完成FE表情第%i张图片的小波特征提取',i));
end
for i=1:19
  B=imread(strcat('train\','DI\',num2str(i),'.tiff'));
   X = double(B);
  X = imresize(X,[128 128],'bilinear');  %采用'bilinear':采用双线性插值算法扩展为128*128
  H2=DSLBP(X,mapping,W);%提取图片的LBP直方图
  Gray=X;
  Gray=(Gray-mean(Gray(:)))/std(Gray(:))*20+128;
  lpqhist=lpq(Gray,3,1,1,'nh');       %计算每个照片lpq直方图 
  a=[H2,lpqhist];
  c=[c;a];
  disp(sprintf('完成DI表情第%i张图片的小波特征提取',i));
end
for i=1:20
  B=imread(strcat('train\','AN\',num2str(i),'.tiff'));
    X = double(B);
  X = imresize(X,[128 128],'bilinear');  %采用'bilinear':采用双线性插值算法扩展为128*128
  H2=DSLBP(X,mapping,W);%提取图片的LBP直方图
  Gray=X;
  Gray=(Gray-mean(Gray(:)))/std(Gray(:))*20+128;
  lpqhist=lpq(Gray,3,1,1,'nh');       %计算每个照片lpq直方图 
  a=[H2,lpqhist];
  c=[c;a];
  disp(sprintf('完成AN表情第%i张图片的小波特征提取',i));
end
 
d=[];
for i=1:10
  B=imread(strcat('test\','SU\',num2str(i),'.tiff'));
    X = double(B);
  X = imresize(X,[128 128],'bilinear');  %采用'bilinear':采用双线性插值算法扩展为128*128
  H2=DSLBP(X,mapping,W);%提取图片的LBP直方图
  Gray=X;
  Gray=(Gray-mean(Gray(:)))/std(Gray(:))*20+128;
  lpqhist=lpq(Gray,3,1,1,'nh');       %计算每个照片lpq直方图 
  a=[H2,lpqhist];
  d=[d;a];
  disp(sprintf('完成SU表情测试集第%i张图片的小波特征提取',i));
end
 
verbose = 0;
nbclass=7;
[xsup,w,b,nbsv]=svmmulticlassoneagainstall(P_train,train_label,nbclass,c,lambda,kernel,kerneloption,verbose); %使用支持向量机进行训练获得支持向量
[ypred1,maxi] = svmmultival(P_train,xsup,w,b,nbsv,kernel,kerneloption);  %训练集测试
[ypred2,maxi] = svmmultival(P_test,xsup,w,b,nbsv,kernel,kerneloption);   %测试集测试
CC1=ypred1-train_label;
n1=length(find(CC1==0));
CC2=ypred2-test_label;
n2=length(find(CC2==0));
Accuracytrain=n1/size(train_label,1)   %统计训练精度
Accuracytest=n2/size(test_label,1)     %统计测试精度

三、备注

完整代码或者代写添加QQ912100926
往期回顾>>>>>>
【图像压缩】图像处理教程系列之图像压缩【Matlab 074期】
【图像分割】图像处理教程系列之图像分割(一)【Matlab 075期】
【图像分割】图像处理教程系列之图像分割(二)【Matlab 076期】
【模式识别】银行卡号之识别【Matlab 077期】
【模式识别】指纹识别【Matlab 078期】
【图像处理】基于GUI界面之DWT+DCT+PBFO改进图像水印隐藏提取【Matlab 079期】
【图像融合】CBF算法之图像融合【Matlab 080期】
【图像去噪】自适应形态学之图像去噪【Matlab 081期】
【图像增强】DEHAZENET和HWD之水下去散射图像增强【Matlab 082期】
【图像增强】PSO寻优ACE之图像增强【Matlab 083期】
【图像重建】ASTRA算法之图像重建【Matlab 084期】
【图像分割】四叉树之图像分割【Matlab 085期】
【图像分割】心脏中心线之提取【Matlab 086期】
【图像识别】SVM植物叶子之疾病检测和分类【Matlab 087期】
【图像识别】基于GUI界面之模板匹配手写数字识别系统【Matlab 088期】
【图像识别】基于GUI界面之不变矩的数字验证码识别【Matlab 089期】
【图像识别】条形码识别系统【Matlab 090期】
【图像识别】基于GUI界面RGB和BP神经网络之人民币识别系统【Matlab 091期】
【图像识别】CNN卷积神经网络之验证码识别【Matlab 092期】
【图像分类】极限学习分类器之对遥感图像分类【Matlab 093期】
【图像变换】DIBR-3D之图像变换【Matalb 094期】
【图像分割】模糊聚类算法之FCM图像分割【Matlab 095期】
【模式识别】银行监控系统之人脸识别【Matlab 096期】
【模式识别】基于GUI界面之疲劳检测系统【Matlab 097期】
【图像识别】国外车牌识别【Matlab 098期】
【图像分割】最大类间方差法(otsu)之图像分割【Matlab 099期】
【图像分割】直觉模糊C均值聚类之图像分割IFCM【Matlab 100期】
【图像分割】基于matlab形态学重建和过滤改进FCM算法(FRFCM)之图像分割【Matlab 101期】
【图像增强】局部对比度增强CLAHE算法之直方图增强【Matlab 102期】
【图像融合】Frequency Partition之图像融合【Matlab 103期】
【图像评价】SVM之图像无参考质量评价【Matlab 104期】
【图像边缘检测】最小二乘法用于椭圆边缘检测【Matlab 105期】
【图像加密】基于GUI界面之混沌系统图像加密解密【Matlab 106期】
【图像配准】SIFT算法之图像配准【Matlab 107期】
【图像分割】随机游走算法用于图像分割【Matlab 108期】
【图像分割】形态学重建和过滤改进FCM算法(FRFCM)用于图像分割【Matlab 109期】
【图像分割】图像分割IFCM之直觉模糊C均值聚类【Matlab 110期】
【图像增强】区域相似变换函数与蜻蜓算法之灰度图像增强【Matlab 111期】
【图像直线拟合】最小二乘法之图像直线拟合【Matlab 112期】
【图像去雾】暗通道之图像去雾【Matlab 113期】
【图像识别】基于matlab GUI界面之路面裂缝识别【Matlab 114期】
【图像识别】身份证号码之识别【Matlab 115期】
【图像聚类】FCM和改进之FCM脑部CT图像聚类【Matlab 116期】
【图像评价】CCF算法之图像质量评价【Matlab 117期】
【图像分割】蚁群优化模糊聚类之图像分割【Matlab 118期】
【模式识别】基于GUI界面之水果检测系统【Matlab 119期】
【模式识别】基于GUI界面之水果分类系统【Matlab 120期】
【模式识别】基于GUI界面之水果分级系统【Matlab 121期】
【模式识别】人脸识别之检测脸、眼、鼻子和嘴【Matlab 122期】
【图像处理】基于 GUI界面之图像加解密【Matlab 124期】
【模式识别】基于GUI界面BP网络之手写体大写字母识别【Matlab 125期】
【图像分割】基于GUI界面之医学影像分割【Matlab 126期】
【图频处理】基于GUI界面之环图像处理与音乐播放系统【Matlab 127期】
【图像隐藏】基于Laguerre 变换之图像隐藏【Matlab 128期】
【图像处理】基于dwt函数之实现二维小波变换【Matlab 129期】
【图像处理】分形插值算法之调换图片【Matlab 130期】
【图像边缘检测】基于GUI界面之图像边缘检测系统【Matlab 131期】
【图像分割】基于GUI界面之彩色图像分割【Matlab 132期】
【图像去噪】基于GUI界面之图像滤波去噪【Matlab 133期】
【图像几何运算】基于GUI界面之图像几何运算系统【Matlab 134期】
【图像处理】基于GUI界面之图像处理系统【Matlab 135期】
【图像识别】基于matlab之细胞识别和边缘检测【Matlab 136期】
【模式识别】反馈神经Hopfield的数字识别【Matlab 172期】
【模式识别】指纹图像细节特征提取 【Matlab 173期】
【图像分割】RGB HSV YCbCr Lab颜色空间人脸检测之图像分割【Matlab 174期】
【图像压缩】小波变换之图像压缩【Matlab 175期】
【模式识别】基于GUI界面的火灾检测【Matlab 230期】
【模式识别】基于Hough变换的答题卡识别【Matlab 231期】
【模式识别】二值膨胀差分和椒盐滤波之教室内人数识别系统【Matlab 232期】
【小波变换】基于GUI界面DWT与SVD算法的数字水印 【Matlab 233期】
【模式识别】基于GUI界面的指针式表盘识别【Matlab 234期】
【模式识别】基于Hough变换图片车道线检测 【Matlab 235期】
【图像分割】粒子群优化T熵图像分割【Matlab 236期】
【图像分割】粒子群优化指数熵图像分割【Matlab 237期】
【图像分割】粒子群优化指数熵图像分割【Matlab 238期】
【模式识别】基于GUI贝叶斯最小错误率手写数字识别【Matlab 239期】
【模式识别】PCA手写数字识别【Matlab 240期】
【模式识别】特征匹配的英文印刷字符识别【Matlab 241期】
【模式识别】知识库的手写体数字识别【Matlab 242期】
【模式识别】银行卡数字识别【Matlab 243期】
【边缘检测】插值法亚像素边缘检测【Matlab 248期】
【图像识别】表情检测【Matlab 288期】
【图像检测】LSD直线检测【Matlab 289期】
【图像融合】红外与可见光的融合与配准算法【Matlab 290期】
【图像识别】帧差法跌倒检测【Matlab 291期】
【图像识别】组合BCOSFIRE过滤器进行墙体裂缝识别【Matlab 292期】
【模式识别】中值滤波和二值化的跌倒检测【Matlab 293期】
【图像隐写】DCT的图像隐写【Matlab 294期】
【图像隐写】LSB的图像隐写提取【Matlab 295期】
【图像隐写】高斯模型的JPEG图像隐写【Matlab 296期】
【图像隐写】图像自适应隐写算法wow【Matlab 297期】
【模式识别】基于GUI SVM和PCA的人脸识别【Matlab 298期】
【视频识别】轨迹方法行为识别【Matlab 299期】
【模式识别】基于GUI HSV和RGB模型水果分类【Matlab 300期】
【图像处理】基于GUI数字图像处理平台【Matlab 301期】
【图像分割】视网膜图像分割【Matlab 302期】
【模式识别】k-means聚类的手势识别【Matlab 303期】
【图像处理】Hough变换的人眼虹膜定位【Matlab 304期】
【图像处理】Kalman滤波的目标跟踪【Matlab 305期】
【图像分割】GAC水平集方法实现图像分割【Matlab 306期】
【图像分割】分水岭算法的图像分割【Matlab 307期】
【图像去噪】基于小波变换的图像去噪【Matlab 308期】
【图像融合】基于小波变换的图像融合【Matlab 309期】
【图像识别】图像识别物体计数【Matlab 310期】
【图像增强】模糊集的图像增强【Matlab 311期】
【图像处理】图像RGB三色的合成、分离【Matlab 312期】
【图像处理】鼠标画图【Matlab 313期】
【图像识别】基于二值化条形码识别【Matlab 314期】
【图像压缩】行程编码实现的图像压缩【Matlab 315期】
【图像几何】投影法测距【Matlab 316期】
【边缘检测】插值法亚像素边缘检测【Matlab 317期】
【图像分割】关键像素点的FLICM图像分割【Matlab 318期】
【图像识别】gabor滤波布匹瑕疵检测【Matlab 319期】
【图像识别】基于GUI车牌库识别【Matlab 320期】
【图像识别】国内车牌识别【Matlab 321期】
【图像分割】snake模型的图像分割【Matlab 322期】
【图像去噪】全变分算法图像去噪【Matlab 323期】
【图像去噪】非局部均值(NLM)滤波图像去噪【Matlab 324期】
【图像去噪】中值滤波图像去噪【Matlab 325期】
【边缘检测】元胞自动机图像边缘检测【Matlab 432期】

你可能感兴趣的:(matlab,图像处理)