转自http://blog.csdn.net/ty101/article/details/8905394

本文的PDF版本,以及涉及到的所有文献和代码可以到下列地址下载:

1、PDF版本以及文献:http://download.csdn.net/detail/ty101/5349816

2、原作者的MATLAB代码:http://download.csdn.net/detail/ty101/5349894

LBP一种用来描述图像纹理特征的算子,该算子由芬兰奥卢大学的T.Ojala等人在1996年提出[1],在2002年时,Timo Ojala等人在PAMI上又发表了一篇关于LBP的文章[2],该文章非常清楚的阐述了多分辨率、灰度尺度不变和旋转不变、等价模式的改进的LBP特征。LBP的核心思想就是:以中心像素的灰度值作为阈值,与他的领域相比较得到相对应的二进制码来表示局部纹理特征。呃,这句话实在有些拗口-_-#还是举例吧,下面我们从最简单的入手,一步一步讲解整个LBP特征(整个LBP特征提取流程请看文章最后的appendix)。

l  初级的LBP计算方法(先撇开多分辨率、灰度尺度不变、旋转不变^_^)

假设我们有一个3*3的窗口,窗口内的值代表每个像素的灰度值,如下所示:

可以看到中心像素点的灰度值为6,我们将这个中心像素点的灰度值与它周围8领域的像素值大小做比较,也就是说我们将7、9、8、7、1、2、5、6这8个数字分别与6做比较,大于6,我们则把右边相应的方格置为1,小于6则置为0。之后我们就得右边的窗口,我们按逆时针方向把这些1和0连起来就得到了所谓的LBP模式:11110001(注意是二进制的),然后将这个数转换为10进制,也就是241。

Tips:扩展后的LBP中的窗口形状

上面所说的版本是Timo Ojala在1996年提出的,在2002年的时候Timo Ojala在PAMI上的文章对上述算法进行了拓展。拓展后的算法可以设置邻域和半径的属性,用P来表示邻域像素点个数,用R来表示半径,上面我们描述的初级版本就是P=8,R=1.0的版本(不考虑插值,后面会详细描述)。下图描述了P,R取不同值时的情形:

注意初级版本[1]的领域是没有表现出插值的思想的(也就是方形邻域),而2002年的PAMI文章[2]是圆形邻域,是涉及到插值的(可以看出,只有对角线的像素需要插值)。其实将方形窗口换成圆形窗口也有利于后面的旋转不变性的实现,后面会详细描述。

Tips:关于LBP的亮度变化鲁棒性以及灰度尺度不变

灰度尺度不变其实很好理解,我们依旧用图1为例子,我们将亮度放大10倍:

可以看到,灰度尺度的变换并没有对最后的局部二值模式产生影响,同样的道理,即使该窗口的9个像素的灰度值出现了亮度的非线性变换,只要中心像素的灰度值与8邻域内像素的灰度值的大小关系不变,那么最终产生的LBP特征就不会改变。但是请注意:要是亮度变换后,中心像素灰度值与周围像素的灰度值大小关系与变换前不一样,那么LBP特征就会随之改变了。例如,图1中的窗口,亮度进行了一次非线性的变化,结果为:

可以看出,右边的局部二值模式已经和图1中的局部二值模式不一样了。

为LBP算子加入旋转不变性

在2000年Pietikinen等人在文章[3]中描述了如何扩展LBP特征,使之具备旋转不变性。下面我们以一个P=8,R=1.0的圆形窗口作为例子,讲解LBP算子的旋转不变性。令中心点的灰度值为gc,8邻域内的8个像素灰度值分别为gi={g0,g1,…,g7},当图像发生旋转时,圆形邻域内的灰度值gi是在以gc为中心R为半径的圆周上运动的。例如我们有一个这样的窗口:

那么把图像逆时针旋转每次45度,枚举出所有可能的取值,得到如下结果:

我们可以发现,只要我们取上述枚举出来的值的最小值,就可以消除旋转带来的影响。例如我们得到一个二进制的LBP值10000011(也就是原图逆时针旋转45度),然后不断对这个二进制进行向右循环移位(加上它本身,总共有8种取值可能),之后取最小结果就是该窗口的LBP值。

Tips:旋转不变的LBP特征也起到了一定的特征将维作用

当p=8,R=1.0的时候,最终会有2^p=2^8=256种取值可能,而旋转不变的LBP特征只会存在36种旋转不变的二值模式:

l  利用等价模式来提高旋转不变性

加入了旋转不变性后是不是就万事大吉了呢?其实不是,后来T.Ojala发现效果并不是很好,因为当我们把P和R值取很大时,也就意味着得到的局部二值模式二进制的位数会非常大(P和 R取值越大,邻域内的像素就越多,T.Ojala在论文[2]中已经给出,P的取值为24),这样一来,最后产生的直方图就非常稀疏,不利于分类。而如果p和r取值太小的话,就会使角度的分割精度降低,从而使得后面的分类性能降低。为了解决这些问题,T.Ojala等人在文献[2]中提出了一种叫“等价模式”的方法来降低LBP特征的维数。T.Ojala等人发现,有一类模式在图像中出现的频率及其高,这类模式就是等价模式,它们都有一个特性,就是黑白跳变数量都小于等于2(在图 7中的第一行即为等价模式,其他都为非等价模式)。另外我们也可以推出,在P邻域中,等价模式的个数U为:U=P*(P-1)+2,其他模式都称为非等价模式。等价模式的LBP值就等于二值编码中1的个数,非等价模式的LBP值为P+1,用公式来表示就是:

其中U(LBPp,R)<=2 就表示0,1跳变次数小于等于2。尽管等价模式只占了全部模式的一小部分,但是T.Ojala表明这一小部分等价模式能够刻画90%以上的纹理特征。

l  关于LBP支持多分辨率的分析

我们在图2中可以看出,只要不断改变P和R的大小(即图像处理中常用的所谓“窗口大小”的概念),即可以让LBP具有多分辨率识别的特性,还有一种常见的方法是不改变P和R的大小,而是将图像按某一因子缩放,T.Ojala在会议论文[4]中提出,根据他们实验得出使用前一种方法(及改变窗口大小而非scale图片)会得到更好的效果。当如在[4]在,T.Ojala等人还提出将图像的灰度直方图和LBP特征结合来增强分类的效果,具体的内容可以参考Texture Classification byMulti-Predicate Local Binary Pattern Operators这篇文章^_^。

下面是一些关于LBP“原汁原味”的文章,多看看原作者的文章才是王道,呵呵。

参考文献:

[1]T.Ojala, M.Pietikinen et al. A Comparative Study of Texture Measures with Classification based on Feature Distribution. Pattern Recognition. 1996. Vol.29.pp.51-59.

[2]T.Ojala, M.Pietikinen. Multiresolution Gray-Scale and Rotation InvariantTexture Classification with Local Binary Patterns. Pattern analysis and MachineIntelligence. Vol.24.7.pp.971-986

[3]M.Pietikinen, T.Ojala, and Z.Xu. Rotation-Invariant Texture ClassificationUsing Feature Distributions. Pattern Recognition. 2000. Vol.33.pp.43-52.

[4] T.Maenpaa , M. Pietikinen, and T. Ojala, “Texture Classification byMulti-Predicate Local Binary Pattern Operators,” Proc. 15th Int'l Conf.Pattern Recognition, vol. 3, pp. 951-954, 2000.

Appendix:LBP特征提取流程图

本文的PDF版本,以及涉及到的所有文献和代码可以到下列地址下载:

1、PDF版本以及文献:http://download.csdn.net/detail/ty101/5349816

2、原作者的MATLAB代码:http://download.csdn.net/detail/ty101/5349894

LBP一种用来描述图像纹理特征的算子,该算子由芬兰奥卢大学的T.Ojala等人在1996年提出[1],在2002年时,Timo Ojala等人在PAMI上又发表了一篇关于LBP的文章[2],该文章非常清楚的阐述了多分辨率、灰度尺度不变和旋转不变、等价模式的改进的LBP特征。LBP的核心思想就是:以中心像素的灰度值作为阈值,与他的领域相比较得到相对应的二进制码来表示局部纹理特征。呃,这句话实在有些拗口-_-#还是举例吧,下面我们从最简单的入手,一步一步讲解整个LBP特征(整个LBP特征提取流程请看文章最后的appendix)。

l  初级的LBP计算方法(先撇开多分辨率、灰度尺度不变、旋转不变^_^)

假设我们有一个3*3的窗口,窗口内的值代表每个像素的灰度值,如下所示:

可以看到中心像素点的灰度值为6,我们将这个中心像素点的灰度值与它周围8领域的像素值大小做比较,也就是说我们将7、9、8、7、1、2、5、6这8个数字分别与6做比较,大于6,我们则把右边相应的方格置为1,小于6则置为0。之后我们就得右边的窗口,我们按逆时针方向把这些1和0连起来就得到了所谓的LBP模式:11110001(注意是二进制的),然后将这个数转换为10进制,也就是241。

Tips:扩展后的LBP中的窗口形状

上面所说的版本是Timo Ojala在1996年提出的,在2002年的时候Timo Ojala在PAMI上的文章对上述算法进行了拓展。拓展后的算法可以设置邻域和半径的属性,用P来表示邻域像素点个数,用R来表示半径,上面我们描述的初级版本就是P=8,R=1.0的版本(不考虑插值,后面会详细描述)。下图描述了P,R取不同值时的情形:

注意初级版本[1]的领域是没有表现出插值的思想的(也就是方形邻域),而2002年的PAMI文章[2]是圆形邻域,是涉及到插值的(可以看出,只有对角线的像素需要插值)。其实将方形窗口换成圆形窗口也有利于后面的旋转不变性的实现,后面会详细描述。

Tips:关于LBP的亮度变化鲁棒性以及灰度尺度不变

灰度尺度不变其实很好理解,我们依旧用图1为例子,我们将亮度放大10倍:

可以看到,灰度尺度的变换并没有对最后的局部二值模式产生影响,同样的道理,即使该窗口的9个像素的灰度值出现了亮度的非线性变换,只要中心像素的灰度值与8邻域内像素的灰度值的大小关系不变,那么最终产生的LBP特征就不会改变。但是请注意:要是亮度变换后,中心像素灰度值与周围像素的灰度值大小关系与变换前不一样,那么LBP特征就会随之改变了。例如,图1中的窗口,亮度进行了一次非线性的变化,结果为:

可以看出,右边的局部二值模式已经和图1中的局部二值模式不一样了。

为LBP算子加入旋转不变性

在2000年Pietikinen等人在文章[3]中描述了如何扩展LBP特征,使之具备旋转不变性。下面我们以一个P=8,R=1.0的圆形窗口作为例子,讲解LBP算子的旋转不变性。令中心点的灰度值为gc,8邻域内的8个像素灰度值分别为gi={g0,g1,…,g7},当图像发生旋转时,圆形邻域内的灰度值gi是在以gc为中心R为半径的圆周上运动的。例如我们有一个这样的窗口:

那么把图像逆时针旋转每次45度,枚举出所有可能的取值,得到如下结果:

我们可以发现,只要我们取上述枚举出来的值的最小值,就可以消除旋转带来的影响。例如我们得到一个二进制的LBP值10000011(也就是原图逆时针旋转45度),然后不断对这个二进制进行向右循环移位(加上它本身,总共有8种取值可能),之后取最小结果就是该窗口的LBP值。

Tips:旋转不变的LBP特征也起到了一定的特征将维作用

当p=8,R=1.0的时候,最终会有2^p=2^8=256种取值可能,而旋转不变的LBP特征只会存在36种旋转不变的二值模式:

l  利用等价模式来提高旋转不变性

加入了旋转不变性后是不是就万事大吉了呢?其实不是,后来T.Ojala发现效果并不是很好,因为当我们把P和R值取很大时,也就意味着得到的局部二值模式二进制的位数会非常大(P和 R取值越大,邻域内的像素就越多,T.Ojala在论文[2]中已经给出,P的取值为24),这样一来,最后产生的直方图就非常稀疏,不利于分类。而如果p和r取值太小的话,就会使角度的分割精度降低,从而使得后面的分类性能降低。为了解决这些问题,T.Ojala等人在文献[2]中提出了一种叫“等价模式”的方法来降低LBP特征的维数。T.Ojala等人发现,有一类模式在图像中出现的频率及其高,这类模式就是等价模式,它们都有一个特性,就是黑白跳变数量都小于等于2(在图 7中的第一行即为等价模式,其他都为非等价模式)。另外我们也可以推出,在P邻域中,等价模式的个数U为:U=P*(P-1)+2,其他模式都称为非等价模式。等价模式的LBP值就等于二值编码中1的个数,非等价模式的LBP值为P+1,用公式来表示就是:

其中U(LBPp,R)<=2 就表示0,1跳变次数小于等于2。尽管等价模式只占了全部模式的一小部分,但是T.Ojala表明这一小部分等价模式能够刻画90%以上的纹理特征。

l  关于LBP支持多分辨率的分析

我们在图2中可以看出,只要不断改变P和R的大小(即图像处理中常用的所谓“窗口大小”的概念),即可以让LBP具有多分辨率识别的特性,还有一种常见的方法是不改变P和R的大小,而是将图像按某一因子缩放,T.Ojala在会议论文[4]中提出,根据他们实验得出使用前一种方法(及改变窗口大小而非scale图片)会得到更好的效果。当如在[4]在,T.Ojala等人还提出将图像的灰度直方图和LBP特征结合来增强分类的效果,具体的内容可以参考Texture Classification byMulti-Predicate Local Binary Pattern Operators这篇文章^_^。

下面是一些关于LBP“原汁原味”的文章,多看看原作者的文章才是王道,呵呵。

参考文献:

[1]T.Ojala, M.Pietikinen et al. A Comparative Study of Texture Measures with Classification based on Feature Distribution. Pattern Recognition. 1996. Vol.29.pp.51-59.

[2]T.Ojala, M.Pietikinen. Multiresolution Gray-Scale and Rotation InvariantTexture Classification with Local Binary Patterns. Pattern analysis and MachineIntelligence. Vol.24.7.pp.971-986

[3]M.Pietikinen, T.Ojala, and Z.Xu. Rotation-Invariant Texture ClassificationUsing Feature Distributions. Pattern Recognition. 2000. Vol.33.pp.43-52.

[4] T.Maenpaa , M. Pietikinen, and T. Ojala, “Texture Classification byMulti-Predicate Local Binary Pattern Operators,” Proc. 15th Int'l Conf.Pattern Recognition, vol. 3, pp. 951-954, 2000.

Appendix:LBP特征提取流程图

 
0

转载:LBP的初步理解的更多相关文章

  1. (转载)从Java角度理解Angular之入门篇:npm, yarn, Angular CLI

    本系列从Java程序员的角度,带大家理解前端Angular框架. 本文是入门篇.笔者认为亲自动手写代码做实验,是最有效最扎实的学习途径,而搭建开发环境是学习一门新技术最需要先学会的技能,是入门的前提. ...

  2. javascript 原型及原型链的初步理解

    最近折腾了好久,终于是把js里面的原型和原型链做了个初步的理解: 在这里,我打个比喻: 我(child),我妈constructor(构造函数)生了我:别人问我老妈跟谁生的我,于是此时我妈会指向我爸爸 ...

  3. Spring学习笔记--环境搭建和初步理解IOC

    Spring框架是一个轻量级的框架,不依赖容器就能够运行,像重量级的框架EJB框架就必须运行在JBoss等支持EJB的容器中,核心思想是IOC,AOP,Spring能够协同Struts,hiberna ...

  4. Graph Cuts初步理解

    一些知识点的初步理解_8(Graph Cuts,ing...) Graph cuts是一种十分有用和流行的能量优化算法,在计算机视觉领域普遍应用于前背景分割(Image segmentation).立 ...

  5. 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感

    关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...

  6. springBoot(1)---springboot初步理解

    springboot初步理解 在没有用SpringBoot之前,我们用spring和springMVC框架,但是你要做很多比如: (1)配置web.xml,加载spring和spring mvc 2) ...

  7. Mysql加锁过程详解(7)-初步理解MySQL的gap锁

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  8. 关于THINKPHP5模型关联的初步理解

    初步理解的意思是,使用最常用的关联模型,然后可以正常运行 还是打个比方 文章表  和文章分类表 一个文章分类可以有多个文章  所以  文章分类模型和文章建立 hasMany的关联 而文章和文章分类表则 ...

  9. spfa+差分约束系统(C - House Man HDU - 3440 )+对差分约束系统的初步理解

    题目链接:https://cn.vjudge.net/contest/276233#problem/C 题目大意:有n层楼,给你每个楼的高度,和这个人单次的最大跳跃距离m,两个楼之间的距离最小是1,但 ...

随机推荐

  1. cordova 5.0 白名单

    最新的cordova 5.0 更新了白名单机制,增强了安全性,但是也给我们在开发中带来了很多问题: 当你引入谷歌.百度地图时,会出现 Failed to load resource -- 解决办法: ...

  2. Redis系列-存储篇string主要操作函数小结

    通过上两篇的介绍,我们的redis服务器基本跑起来.db都具有最基本的CRUD功能,我们沿着这个脉络,开始学习redis丰富的数据结构之旅,当然先从最简单且常用的string开始. 1.新增 a)se ...

  3. python多线程与多进程

    由于python的内存回收机制不是线程安全的,所以就有了GIL保证每个进程内,同一时刻最多只有一个线程在运行. 于是,对于python的多线程来讲,其实同一时刻依然只有一个线程在运行.而且由于线程切换 ...

  4. C++二叉查找树实现及转化为双向链表

    二叉树首先要有树节点 template<class T> class BinaryNode { public: T element; BinaryNode *left; BinaryNod ...

  5. RPI学习--环境搭建_刷卡+wiringPi库安装

    1,镜像地址 http://www.raspberrypi.org/downloads/ 2,Windows下刷写工具 Win32 Disk Imager 3,安装wiringPi库 (这里在连网状态 ...

  6. Apache Jmeter(1)

    Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域. 它可以用于测试静态和动态资源例如静态文件. ...

  7. OpenCV之响应鼠标(二):函数cvSetMouseCallback()和其副程式onMouse()的使用(OpenCV2.4.5)

    每當滑鼠在視訊視窗介面點擊一下的時候,都會有固定三個動作 1.點擊(Click) 2.放開(Down)3.滑動(move) 因此,程式執行滑鼠在點擊的時候onMouse()都會連續跑三次,代表滑鼠在點 ...

  8. HDFS的可靠性

    HDFS的可靠性 1.冗余副本策略   2.机架策略    3.心跳机制    4.安全模式 5.校验和           6.回收站       7.元数据保护    8.快照机制 1.冗余副本策 ...

  9. Notification通知栏

    Notification通知栏 首先实现的功能就是通知栏显示Notification,Notification是显示在系统的通知栏上面的,所以Notification 是属于进程之前的通讯.进程之间的 ...

  10. Multiple dex files define

    Multiple dex files define 在项目中,有一个类的包名和引用的jar包中的类和包名一致