一、LBP简介

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的改进版本:
原始的LBP提出后,研究人员不断对其提出了各种改进和优化。

(1)圆形LBP算子:
基本的 LBP 算子的最大缺陷在于它只覆盖了一个固定半径范围内的小区域,这显然不能满足不同尺寸和频率纹理的需要。为了适应不同尺度的纹理特征,并达到灰度和旋转不变性的要求,Ojala 等对 LBP 算子进行了改进,将 3×3 邻域扩展到任意邻域,并用圆形邻域代替了正方形邻域,改进后的 LBP 算子允许在半径为 R 的圆形邻域内有任意多个像素点。从而得到了诸如半径为R的圆形区域内含有P个采样点的LBP算子;

(2)LBP旋转不变模式
从 LBP 的定义可以看出,LBP 算子是灰度不变的,但却不是旋转不变的。图像的旋转就会得到不同的 LBP值。
Maenpaa等人又将 LBP 算子进行了扩展,提出了具有旋转不变性的 LBP 算子,即不断旋转圆形邻域得到一系列初始定义的 LBP 值,取其最小值作为该邻域的 LBP 值。
图 2.5 给出了求取旋转不变的 LBP 的过程示意图,图中算子下方的数字表示该算子对应的 LBP 值,图中所示的 8 种 LBP模式,经过旋转不变的处理,最终得到的具有旋转不变性的 LBP 值为 15。也就是说,图中的 8 种 LBP 模式对应的旋转不变的 LBP 模式都是00001111。

(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对光照具有很强的鲁棒性
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。然后对参数进行统计分析,若参数是相关的,则用奇异值分解去相关并且量化。

二、部分源代码

function varargout = identification(varargin)
% IDENTIFICATION MATLAB code for identification.fig
%      IDENTIFICATION, by itself, creates a new IDENTIFICATION or raises the existing
%      singleton*.
%
%      H = IDENTIFICATION returns the handle to a new IDENTIFICATION or the handle to
%      the existing singleton*.
%
%      IDENTIFICATION('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in IDENTIFICATION.M with the given input arguments.
%
%      IDENTIFICATION('Property','Value',...) creates a new IDENTIFICATION or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before identification_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to identification_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES% Edit the above text to modify the response to help identification% Last Modified by GUIDE v2.5 06-Aug-2021 03:03:30% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...'gui_Singleton',  gui_Singleton, ...'gui_OpeningFcn', @identification_OpeningFcn, ...'gui_OutputFcn',  @identification_OutputFcn, ...'gui_LayoutFcn',  [] , ...'gui_Callback',   []);
if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});
endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
elsegui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT% --- Executes just before identification is made visible.
function identification_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to identification (see VARARGIN)% Choose default command line output for identification
handles.output = hObject;% Update handles structure
guidata(hObject, handles);% UIWAIT makes identification wait for user response (see UIRESUME)
% uiwait(handles.figure1);% --- Outputs from this function are returned to the command line.
function varargout = identification_OutputFcn(hObject, eventdata, handles)
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)% Get default command line output from handles structure
varargout{1} = handles.output;% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
[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+(h(i,1)-ss(i,j))^2;%欧式距离%w=w-ss(i,j)*(log(h(i,1)+1e-100));%log-likelihood statistic%w=w+min(ss(i,j),h(i,1));%histogram intersectionw=w+(((ss(i,j)-lbp_face(i,1)).^2)./(ss(i,j)+lbp_face(i,1)+(1e-10)));%chi aquare statisticendw=sqrt(w);L(j)=w;endaxes(handles.axes3);
imshow(str);% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
%用5*5模板计算LBP特征值
%法一
function [out]=calculatelbp2(mat)
[m,n]=size(mat);
%mat=double(mat);
in=mat;
r=m+4;
c=n+4;
%out=zeros(m,n);
A=zeros(r,c);
r0=3:r-2;
c0=3:c-2;
A(r0,c0)=in;
%alpha=2-sqrt(2);
alpha=0.5;
beta=1-alpha;
d0=A(r0,c0-2)-in;
d2=A(r0+2,c0)-in;
d4=A(r0,c0+2)-in;
d6=A(r0-2,c0)-in;
d1=alpha*A(r0+1,c0-1)+beta*A(r0+2,c0-2)-in;
d3=alpha*A(r0+1,c0+1)+beta*A(r0+2,c0+2)-in;
d5=alpha*A(r0-1,c0+1)+beta*A(r0-2,c0+2)-in;
d7=alpha*A(r0-1,c0-1)+beta*A(r0-2,c0-2)-in;d=[d0(:),d1(:),d2(:),d3(:),d4(:),d5(:),d6(:),d7(:)];
code=2.^(7:-1:0)';
out =reshape((d>=0)*code,m,n);
%法二
%out=mat2gray(out);
%imshow(out);
%可先声明一个大矩阵,把mat放入矩阵中
% [m,n]=size(mat);
% mat=[zeros(m,2) mat zeros(m,2)];
% mat=[zeros(2,n+4);mat;zeros(2,n+4)];
% A=zeros(5,5);
% p=zeros(1,8);
% k=0;
% lbp=zeros(size(mat));
% h=zeros(1,8);
% for i=3:(m+2)
%  for j=3:(n+4)
%         lbpnumber=0;
%         A=mat(i:i+4,j:j+4);
%         k=A(3,3);
%         p(2)=(A(1,1)+A(2,2))/2;
%         p(3)=A(1,3);
%         p(4)=(A(1,5)+A(2,4))/2;
%         p(1)=A(3,1);
%         p(5)=A(3,5);
%         p(8)=(A(5,1)+A(4,2))/2;
%         p(7)=A(5,3);
%         p(6)=(A(5,5)+A(5,4))/2;
%         h=(p>=k);
%         for q=1:8
%             lbpnumber=lbpnumber+(h(q)*2^(8-q));
%         end
%         lbp(i+2,j+2)=lbpnumber;
%     end
% end、
%对应3*3模板特征值形成特征向量
function [m,f]=lbpfeaturevector(mat,s,n)
[~,~,d]=size(mat);
if d==3mat=rgb2gray(mat);
end
mat=double(mat);
mat=imresize(mat,[100 100],'bicubic');%归一化k=calculatelbp(mat);
f=mat2gray(k);
%imshow(f);
k=uint8(k);
m=[];
for i=1:n:sfor j=1:n:sA=k(i:(i+19),j:(j+19));h=[];h=imhist(A);m=[m;h/(n*n)];end
end
%     lbp(1:2,:)=[];
%    lbp((1+m):end,:)=[];
%     lbp(:,1:2)=[];
%     lbp(:,(1+n):end)=[];
% end
% imshow(lbp,[]);%强制转换为double 类型

三、运行结果


四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.

【人脸识别】基于matlab GUI LBP人脸识别【含Matlab源码 1282期】相关推荐

  1. 【光学】基于matlab GUI杨氏双缝干涉【含Matlab源码 001期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI杨氏双缝干涉[含Matlab源码 001期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: 付费 ...

  2. 【人脸识别】基于matlab GUI人数统计【含Matlab源码 2121期】

    ⛄一.人数统计简介(附课程作业报告) 1 课题背景 本课题为基于matlab的人数统计系统.近年来,很多行业对人流信息有极大的需求,如汽车公交站,地铁站台,商场出入口等.通过人数统计系统可以方便.可靠 ...

  3. 基于SSM的仓库管理系统(含完整源码+论文)

    后端框架:SSM 数据库:MySQL 开发工具:IDEA/Eclipse 系统介绍:本系统是基于SSM框架进行设计,MySQL作为底层数据库,前端采用bootstrap 模块大致介绍:包括库存管理.出 ...

  4. 【心电信号】基于matlab GUI心电信号预处理【含Matlab源码 938期】

    ⛄一.心电信号预处理方法简介 理论知识参考文献:心电信号预处理方法研究 ⛄二.部分源代码 function varargout = kaishi(varargin) gui_Singleton = 1 ...

  5. matlab svm 语音识别,【情感识别】基于matlab支持向量机(SVM)的语音情感识别【含Matlab源码 543期】...

    一.简介 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本.非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数 ...

  6. 【Matlab人脸识别】BP神经网络人脸识别(含识别率)【含GUI源码 891期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]BP神经网络人脸识别(含识别率)[含GUI源码 891期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] ...

  7. 【Matlab人脸识别】形态学教室人数统计(带面板)【含GUI源码 1703期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]形态学教室人数统计(带面板)[含GUI源码 1703期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]孟 ...

  8. 【Matlab人脸识别】人脸实时检测与跟踪【含GUI源码 673期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]人脸实时检测与跟踪[含GUI源码 673期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]孟逸凡,柳益君 ...

  9. 【Matlab人脸识别】KL变换人脸识别【含GUI源码 859期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]KL变换人脸识别[含GUI源码 859期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅.MAT ...

  10. 【芯片识别】基于matlab GUI形态学PCB板芯片识别【含Matlab源码 1820期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[芯片识别]基于matlab GUI形态学 PCB板芯片识别[含Matlab源码 1820期] 点击上面蓝色字体,直接付费下载,即可. 获 ...

最新文章

  1. ORACLE安装启图形界面与oracle安装介质解压后缺jar包
  2. 计算机组成原理的中央控制器,计算机组成原理第六章中央控制器(6-7,8,9).pdf
  3. 我这样写代码,比直接使用 MyBatis 效率提高了 100 倍
  4. leetcode 235. Lowest Common Ancestor of a Binary Search Tree | 235. 二叉搜索树的最近公共祖先(哈希表)
  5. 离散信号的希尔伯特变换的计算公式_希尔伯特变换和瞬时频率问题--连载(二)...
  6. php网站https怎么做301,php网站如何增加https安全访问
  7. 视频教程-Excel VBA网抓教程【你学得会】-Office/WPS
  8. 磁力搜索引擎-RunBt
  9. wine模拟器安装xshell
  10. Dim Temp%的意思
  11. 【小程序】报getUserProfile:fail can only be invoked by user TAP gesture.
  12. 教孩子学编程python豆瓣_教孩子学编程 Python
  13. 笔记本CPU忽高忽低问题的解决
  14. 超声波模块测距 Arduino代码
  15. 树莓派4B从开箱到连接电脑(超级小白)
  16. 支付宝小程序使用MQTT over WebSocket连接阿里云IoT物联网平台
  17. 易语言进程通信c语言,易语言进程通信模块和例程源码
  18. cannot be cast to javax.servlet.Servlet 解决
  19. 二次元动漫卡通风格手机APP应用下载页自适应源码
  20. 《软件学报》《计算机学报》《计算机研究与发展》为计算机类三大权威刊物

热门文章

  1. Prometheus Operator 架构 - 每天5分钟玩转 Docker 容器技术(178)
  2. [GZOI2016] 亚索的量子实验【分块】
  3. 关于Net Core 多平台程序的Framework问题
  4. [查阅]MSIL Instruction Set
  5. will would 七大用法总结
  6. Atitit it领域知识点 划分 acm18知识树 目录 1. Acm总结的18个计算机科学关键领域 ACM知识树 1 1.1. 大学级别的计算机科学知识可以归纳成14个知识领域: 3 2. U
  7. Atitti 编程语言高级 api 与高级知识 堆栈api 异常api Meta anno注解元数据api Ref 反射api Database meta api 字节码库如果你正在编写一个框架或者
  8. Atitit 常见面试问题回答法 原则与细则 目录 1.1. 1、工作多久了?为什么离职? 1 1.2. 、自我评价 1 1.3. 问你有什么缺点 2 1.4. 4、理想薪资 2 1.5. 职业规
  9. Atitit 学习的本质 团队管理与培训的本质 attilax总结 1. 学习的定义 1 2. 学习的本质是数据的处理,海量的数据,处理能力有限的大脑 2 2.1. 摘要(缩小数据体量。。这个过程有
  10. Atitit 性能指标与性能提升的5个原则与性能提升模型