基于LBP人脸特征提取算法的人员身份信息验证matlab仿真

280 阅读3分钟

1.算法仿真效果

matlab2022a仿真结果如下:

1.png

2.png

3.png  

2.算法涉及理论知识概要

       LBP(Local Binary Patterns,局部二值模式)是提取局部特征作为判别依据的。LBP方法显著的优点是对光照不敏感,但是依然没有解决姿态和表情的问题。不过相比于特征脸方法,LBP的识别率已经有了很大的提升。在[1]的文章里,有些人脸库的识别率已经达到了98%+。LBP是Local Binary Patterns的缩写,即局部二值模式。它是由T. Ojala, M. Pietikäinen和 D. Harwood等人在1994年提出来的,属于一种特殊的、简单有效的纹理特征描述子(Feature Descriptor)。

 

       LBP描述子不仅计算过程相对简单,而且产生的最终效果也不错,因而在学术界和工业界的很多领域都得到了较为广泛的应用。例如,目前非常火热的人脸识别研究方向中就有不少采用了这种描述子来完成。另外,OpenCV和scikit-image等多种图像处理库也专门提供了LBP的实现接口,其重要性可见一斑。

 

       最初的LBP是定义在像素3x3邻域内的,以邻域中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3x3邻域内的8个点经比较可产生8位二进制数(通常转换为十进制数即LBP码,共256种),即得到该邻域中心像素点的LBP值,并用这个值来反映该区域的纹理信息。如下图所示:

 

a5b484a3a9950a9489d9d12e4c7a9512_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

 用比较正式的公式来定义的话:

 

4f8e9cdb916d0b49cc15b461bd7479b5_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

其中代表3x3邻域的中心元素,它的像素值为ic,ip代表邻域内其他像素的值。s(x)是符号函数,定义如下:

 

8c31cfa4bfa9cbfbc43d6b69ecbcaf42_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

       LBP还有另外一个变种是统一模式(Uniform Patterns)。其本质是基于旋转不变性特征和降维,将LBP的直方图表示从256降到59个BIN即可表示。统一模式的58个LBP表示如下(其中R=1,圆形)除此以外的都被称为非统一模式,全部放到一个BIN里面即可,这样总数就是59个BIN。而在纹理匹配中,通过傅里叶变换到频域空间,可以得到旋转不变性特征,实现基于LBP的纹理匹配。

 

 

 

3.MATLAB核心程序 `[filename,pathname]=uigetfile({'.jpg';'.tif'},'file selector');

str=[pathname filename];

I=imread(str);

axes(handles.axes1);

 

imshow(I);

 

lbp_face=[];

[lbp_face,feature]=lbpfeaturevector2(I,100,20);

axes(handles.axes2);

imshow(feature);

load('fb_lbp_face.mat')

ss=[];

ss=LBP_face(:,:);

ref_labels=label;

ref_label=number_label;

L=zeros(1,size(ss,2));

text=[];

%d=sum((A-B).^2);

 

   for j=1:size(ss,2)

        w=0;

    for i=1:size(lbp_face,1)

           w=w+(((ss(i,j)-lbp_face(i,1)).^2)./(ss(i,j)+lbp_face(i,1)+(1e-10)));%chi aquare statistic

    end

    w=sqrt(w);

    L(j)=w;

    end

[value,idx]=sort(L,'ascend');

sort_labels=ref_labels(idx);

sort_label1=ref_label(idx);

% set(sort_label,'String',sort_label1);

 sort_label=cell2mat(sort_labels(1));

% sort_label=sort_label1{1};

if (sort_label1(1)<43)

str=['.\fb_face' sort_label 'fb010_930831.jpg'];

end`