LBP基本原理与特征分析

article/2025/9/19 2:01:33

转自:http://blog.csdn.net/songzitea/article/details/17686135

背景介绍

局部二值模式(Local binary patterns,LBP)是机器视觉领域中用于描述图像局部纹理特征的算子,具有旋转不变性和灰度不变性等显著的优点。它是由T. Ojala, M.Pietikäinen, 和 D. Harwood [1][2]在1994年提出,LBP在纹理分类问题上是一个非常强大的特征;如果LBP与HOG结合,则可以在一些集合上十分有效的提升检测效果。LBP是一个简单但非常有效的纹理运算符。它将各个像素与其附近的像素进行比较,并把结果保存为二进制数。由于其辨别力强大和计算简单,局部二值模式纹理算子已经在不同的场景下得到应用。LBP最重要的属性是对诸如光照变化等造成的灰度变化的鲁棒性。它的另外一个重要特性是它的计算简单,这使得它可以对图像进行实时分析。本节介绍相关LPB算法特征提取知识。

基本理论

局部二值模式是广泛用于图像分类的一种图像特征,它的特点是,在图像发生光照变化时,提取的特征仍然能够不发生大的改变。提取LBP的过程首先是将原始图像转换为LBP图,然后统计LBP图的LBP直方图,并以这个向量形式的直方图来表示原始的图像。LBP的基本思想是定义于像素的8邻域中,以中心像素的灰度值为阈值,将周围8个像素的值与其比较,如果周围的像素值小于中心像素的灰度值,该像素位置就被标记为0,否则标记为1.每个像素得到一个二进制组合,就像00010011.每个像素有8个相邻的像素点,即有2^8种可能性组合.如下图所示。


因此,LBP操作可以被定义为

其中35是中心像素,亮度是36;而37则是相邻像素的亮度。s是一个符号函数:


这种描述方法使得你可以很好的捕捉到图像中的细节。实际上,研究者们可以用它在纹理分类上得到最先进的水平。正如刚才描述的方法被提出后,固定的近邻区域对于尺度变化的编码失效。所以,使用一个变量的扩展方法,在文献[5]中有描述。主意是使用可变半径的圆对近邻像素进行编码,这样可以捕捉到如下的近邻:


对一个给定的点40   ,他的近邻点 41 可以由如下计算:


其中,R是圆的半径,而P是样本点的个数。这个操作是对原始LBP算子的扩展,所以有时被称为扩展LBP(又称为圆形LBP)。如果一个在圆上的点不在图像坐标上,我们使用他的内插点。计算机科学有一堆聪明的插值方法,而OpenCV使用双线性插值。


LBP的提升版本

原始的LBP提出后,研究人员不断对其提出了各种改进和优化。

圆形LBP算子

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


LBP均匀模式LBP (uniform LBP)

基本地LBP算子可以产生不同的二进制模式,对于半径为R的圆形区域内含有P个采样点的LBP算子将会产生P2种模式。很显然,随着邻域集内采样点数的增加,二进制模式的种类是急剧增加的。均匀模式就是一个二进制序列从0到1或是从1到0的变过不超过2次(这个二进制序列首尾相连)。比如:10100000的变化次数为3次所以不是一个uniform pattern。所有的8位二进制数中共有58个uniform pattern.为什么要提出这么个uniform LBP呢,例如:5×5邻域内20个采样点,有2^20=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(共四次跳变)。通过这样的改进,二进制模式的种类大大减少,而不会丢失任何信息。模式数量由原来的2P种减少为 P ( P-1)+2种,其中P表示邻域集内的采样点数。对于3×3邻域内8个采样点来说,二进制模式由原始的256种减少为58种,即:它把值分为59类,58个uniform pattern为一类,其它的所有值为第59类。这样直方图从原来的256维变成59维。这使得特征向量的维数更少,并且可以减少高频噪声带来的影响。

旋转不变模式LBP

旋转不变模式LBP能够在图片发生一定的倾斜时也能得到相同的结果。它的定义可以看下(注:此图来自于网络):

 


我们看到中心点的邻居不再是它上下左右的8个点(补充一句,不一定非要是3*3的邻域,这个自己定,但是邻域大了意味着直方图向量维度的增加),而是以它为圆心的一个圈,规定了这个圆的半径和点的个数,就可以求出各个点的坐标,但是点的坐标不一定是整数,如果是整数那么这个点的像素值就是对应点的值,如果不是整数,就用差值的方式得到。从 LBP 的定义可以看出,LBP 算子是灰度不变的,但却不是旋转不变的。图像的旋转就会得到不同的 LBP值。Maenpaa等人又将 LBP算子进行了扩展,提出了具有旋转不变性的 LBP 算子,即不断旋转圆形邻域得到一系列初始定义的 LBP值,取其最小值作为该邻域的 LBP 值。

如上图所示(注:此图来自于网络)给出了求取旋转不变的 LBP 的过程示意图,图中算子下方的数字表示该算子对应的 LBP值,图中所示的 8 种 LBP模式,经过旋转不变的处理,最终得到的具有旋转不变性的 LBP值为 15。也就是说,图中的 8种 LBP 模式对应的旋转不变的 LBP模式都是 00001111。

上述介绍了几种不同版本的LBP,对LBP特征向量进行提取的步骤,如下所示:

  1. 将检测窗口划分为16×16的小区域(cell);
  2. 对于每个cell中的一个像素,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3*3邻域内的8个点经比较可产生8位二进制数,即得到该窗口中心像素点的LBP值;
  3. 然后计算每个cell的直方图,即每个数字(假定是十进制数LBP值)出现的频率;然后对该直方图进行归一化处理。
  4. 最后将得到的每个cell的统计直方图进行连接成为一个特征向量,也就是整幅图的LBP纹理特征向量;

然后便可利用SVM或者其他机器学习算法进行分类了。

参考代码

本节,提供基本LBP和均匀模式LBP实现代码地函数。在此给出测试的源图像。如图所示:

基本LBP代码

  1. void LBP(IplImage* src, IplImage* dst){    
  2.     int width=src->width;    
  3.     int height=src->height;    
  4.     for(int j=1;j
  5.         for(int i=1;i
  6.             uchar neighborhood[8]={0};    
  7.             neighborhood[7] CV_IMAGE_ELEM( src, uchar, i-1, j-1);    
  8.             neighborhood[6] CV_IMAGE_ELEM( src, uchar, i-1, j);    
  9.             neighborhood[5] CV_IMAGE_ELEM( src, uchar, i-1, j+1);    
  10.             neighborhood[4] CV_IMAGE_ELEM( src, uchar, i, j-1);    
  11.             neighborhood[3] CV_IMAGE_ELEM( src, uchar, i, j+1);    
  12.             neighborhood[2] CV_IMAGE_ELEM( src, uchar, i+1, j-1);    
  13.             neighborhood[1] CV_IMAGE_ELEM( src, uchar, i+1, j);    
  14.             neighborhood[0] CV_IMAGE_ELEM( src, uchar, i+1, j+1);    
  15.             uchar center CV_IMAGE_ELEM( src, uchar, i, j);    
  16.             uchar temp=0;    
  17.     
  18.             for(int k=0;k<8;k++){    
  19.                 temp+=(neighborhood[k]>center)*(1<<k);    
  20.                
  21.             CV_IMAGE_ELEM( dst, uchar, i, j)=temp;    
  22.            
  23.        
  24.   

输出结果为:

 

UniformPatternLBP代码

 

  1. void UniformPatternLBP(IplImage* src, IplImage* dst)    
  2.     int width=src->width;    
  3.     int height=src->height;    
  4.     uchar table[256];     
  5.     memset(table,0,256);    
  6.     uchar temp=1;    
  7.     for(int i=0;i<256;++i)     
  8.         if(getHopCount(i)<=2)    
  9.             table[i]=temp;    
  10.             temp++;    
  11.            
  12.         // printf("%d\n",table[i]);    
  13.       
  14.     for(int j=1;j
  15.         for(int i=1;i
  16.             uchar neighborhood[8]={0};    
  17.             neighborhood[7] CV_IMAGE_ELEM( src, uchar, i-1, j-1);    
  18.             neighborhood[6] CV_IMAGE_ELEM( src, uchar, i-1, j);    
  19.             neighborhood[5] CV_IMAGE_ELEM( src, uchar, i-1, j+1);    
  20.             neighborhood[4] CV_IMAGE_ELEM( src, uchar, i,   j+1);    
  21.             neighborhood[3] CV_IMAGE_ELEM( src, uchar, i+1, j+1);    
  22.             neighborhood[2] CV_IMAGE_ELEM( src, uchar, i+1, j);    
  23.             neighborhood[1] CV_IMAGE_ELEM( src, uchar, i+1, j-1);    
  24.             neighborhood[0] CV_IMAGE_ELEM( src, uchar, i,   j-1);    
  25.   
  26.             uchar center CV_IMAGE_ELEM( src, uchar, i, j);    
  27.             uchar temp=0;    
  28.     
  29.             for(int k=0;k<8;k++){    
  30.                 temp+=(neighborhood[k]>center)*(1<<k);    
  31.                 
  32.             CV_IMAGE_ELEM( dst, uchar, i, j)=table[temp];    
  33.            
  34.        
  35.  
其中函数代码:

 

  1. int getHopCount(uchar i){    
  2.     int a[8]={0};    
  3.     int k=7;    
  4.     int cnt=0;    
  5.     while(i){    
  6.         a[k]=i&1;    
  7.         i>>=1;    
  8.         --k;    
  9.        
  10.     for(int k=0;k<8;++k){    
  11.         if(a[k]!=a[k+1==8?0:k+1])    
  12.             ++cnt;    
  13.            
  14.        
  15.     return cnt;    
  16.    
输出结果

 

其中对应处理后,图像像素值的分布图,如下所示:


参考资料

[1] T. Ojala, M. Pietikäinen, and D. Harwood (1994), "Performance evaluation of texture measures with classification based on Kullback discrimination of distributions", Proceedings of the 12th IAPR International Conference on Pattern Recognition (ICPR 1994), vol. 1, pp. 582 - 585.

[2] T. Ojala, M. Pietikäinen, and D. Harwood (1996), "A Comparative Study of Texture Measures with Classification Based on Feature Distributions", Pattern Recognition, vol. 29, pp. 51-59.

[3] Local Binary Pattern From Wikipedia, the free encyclopedia.

[4] Local Binary Pattern (LBP)methodology in Scholarpedia.

[5] Face Recognition With OpenCV.


http://chatgpt.dhexx.cn/article/DA3Axnj3.shtml

相关文章

BP算法和LMBP算法

BP算法 反向传播算法(BP算法)是一种监督学习算法&#xff0c;常被用来训练多层感知机。BP算法由两个环节&#xff08;激励传播、权重更新&#xff09;反复循环迭代&#xff0c;直到网络对输入的响应大到预定的目标范围为止。 激励传播包含&#xff1a;&#xff08;向前传播阶段…

LBP(局部二进制模式)

LBP(Local Binary Patterns ,局部二进制模式)是一种理论简单、计算高效的非参数局部纹理特征描述子。由于其具有较高的特征鉴别力和较低的计算复杂度&#xff0c; 近期获得了越来越多的关注&#xff0c;在图像分析、计算机视觉和模式识别领域得到了广泛的应用&#xff0c;尤其是…

图像特征(HOG、LBP、SIFT、SURF)

大纲 引言HOGLBPHARRSIFTSURF特征点获取特征点描述子总结 参考 引言 最近看了些使用将传统的人工特征用于脱机签名的特征提取文章&#xff0c;思路大差不差&#xff0c;都是从脱机签名中提取某种图像特征&#xff0c;再送入判别器进行判别。具体到提取的图像特征层面,当前的图…

对LBP与HOG的理解

LBP(Local Binary Pattern)&#xff0c;局部二值模式 一种描述图像局部纹理特征的算子 主要思想&#xff1a;&#xff1a; 通过比较图像区域中每个像素点与其邻域内像素点的灰度值&#xff0c;利用二进制模式表示的比较结果来描述图像的纹理特征。 keywords&#xff1a;邻域&…

浅谈LBP原理和代码(基于Python)

LBP&#xff0c;全称Local Binary Pattern&#xff0c;局部二值模式&#xff0c;是一种用来描述图像局部特征的算子&#xff0c;具有灰度不变性和旋转不变性的优点 原始LBP算法 33的矩形块&#xff0c;由1个中心像素和它周围的8个邻域像素组成&#xff0c;若相邻像素值大于或…

LBP原理加源码解析

没有看LBP之前觉得它很神秘&#xff0c;看完了之后也就那么回事&#xff0c;不过提出LBP的人确实很伟大&#xff01;&#xff01; LBP&#xff08;Local Binary Pattern&#xff0c;局部二值模式&#xff09;是一种用来描述图像局部纹理特征的算子&#xff1b;它具有旋转不变性…

局部二值模式LBP

文章目录 1.基础介绍2.局部二值模式&#xff08;Local Binary Patterns&#xff0c;LBP&#xff09;编码介绍3.使用skimage求lbp参考资料 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; 1.基础介绍 局部二值模式&#xff08;Local Binary…

LBP(Local Binary Pattern)

一、LBP指局部二值模式&#xff0c;英文全称&#xff1a;Local Binary Pattern&#xff0c;是一种用来描述图像局部特征的算子&#xff0c;LBP特征具有灰度不变性和旋转不变性等显著优点。在1994年提出&#xff0c;由于LBP特征计算简单、效果较好&#xff0c;因此LBP特征在计算…

Windows保护模式(一)段寄存器GDT表

保护模式 x86 CPU的3个模式&#xff1a;实模式、保护模式和虚拟8086模式。 段寄存器 段式内存管理 段式内存管理是将内存划分成若干段&#xff0c;处理器在访问一个内存单元时通过“段基址偏移”的方式计算出实际的物理地址。 在Intel x86处理器中&#xff0c;有专门的段寄存…

段、GDT、调用门学习笔记

保护模式 什么是保护模式 x86 CPU的3个模式:实模式、保护模式、虚拟8086模式。AMD64与Intel64 AMD在1999年的时候拓展了这套指令集&#xff0c;成为x86-64后改名叫AMD64,AMD是首先开发了64拓展&#xff0c;但是AMD的 64位拓展并不支持32位&#xff0c;后来Intel也开发了64位…

linux内核gdt,linux内核学习之全局描述符表(GDT)(二)

在进入保护模式之前&#xff0c;我们先要学习一些基础知识。今天我们看一下全局描述符表(Global Descriptor Table, 简称GDT)。 同实模式一样&#xff0c;在保护模式下&#xff0c;对内存的访问仍然使用段地址加偏移地址。但是&#xff0c;在保护模式下&#xff0c;在每个段能够…

【IDT】 windows IDT GDT LDT

IDT&#xff1a; &#xff08;Interrupt Descrptor Table&#xff09;中断描述符表&#xff0c;用来处理中断的。 IDT的获取&#xff1a; 可以通过SIDT指令&#xff0c;它可以在内存中找到IDT&#xff0c;返回一个IDTR结构的地址。也可以通过kpcr结构获取 ISR&#xff1a; …

GDT 表与段选择子等解析

来源&#xff1a;https://blog.csdn.net/qq_37653144/article/details/82821540 https://blog.csdn.net/yeruby/article/details/39718119 https://blog.csdn.net/lindorx/article/details/89410113 全局描述表(GDT Global Descriptor Table):在保护模式下一个重要的数据结构…

GDT和GDTR

文章目录 GDTR和GDTGDT和GDTR关系GDTR的结构GDT的结构如何在MBR中建立GDT和GDTR? GDTR和GDT GDT和GDTR关系 GDT是global descriptor table&#xff0c;全局描述符表&#xff0c;它是描述符组成的一张描述符表。描述符就是段描述符它用来描述一个段的信息&#xff0c;由8个字节…

GDT,LDT,GDTR,LDTR

GDT,LDT,GDTR,LDTR 前言全局描述符表GDT局部描述符表LDT中断描述符表IDT段选择子任务寄存器TR实例1&#xff1a;访问GDT2&#xff1a;访问LDT 前言 所谓工作模式&#xff0c;是指CPU的寻址方式、寄存器大小、指令用法和内存布局等。 实模式 段基址:段内偏移地址”产生的逻辑地…

GDT和LDT详解

1.GDT 我们回顾一下实际的操作系统的内存关系: ​ 程序/进程 → 映射 段 表 逻辑地址 → segment unit 段 基 址 偏 移 地 址 虚拟地址 → page unit 页 表 物理内存地址 \text{程序/进程}\overset{段表}{\xrightarrow[\text{映射}]{}} \text{逻辑地址}\overset{段基址偏移…

GDT(全局描述符表)和LDT(局部描述符表)

Home > GDT&#xff08;全局描述符表&#xff09;和LDT&#xff08;局部描述符表&#xff09; 每个程序都有自己的LDT&#xff0c;但是同一台计算机上的所有程序共享一个GDT。LDT描述局部于每个程序的段&#xff0c;包括其代码、数据、堆栈等。GDT描述系统段&#xff0c…

什么是数据可视化?

到底什么是数据可视化&#xff1f;带你一窥究竟&#xff5e; 技术人最不该忽视可视化数据分析&#xff01; 导读&#xff1a;在这个“人人都是数据分析师”的时代&#xff0c;大企业的同学几乎都在参与数据的采集、加工与消费。数据可视化作为连接“加工——消费”的重要一环…

当下最火的中台到底是个什么鬼,看完这一篇最通俗易懂的文章后,你就会彻底明白了!...

公众号关注 「奇妙的 Linux 世界」 设为「星标」&#xff0c;每天带你提升技术视野&#xff01; 背景 自从阿里巴巴现任CEO逍遥子在2015年提出”大中台&#xff0c;小前台”战略以来&#xff0c;关于”什么是中台”&#xff0c;可谓是一石激起千层浪&#xff0c;大量文章在描述…