转自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. 二模 (6) day1

    第一题: 设 S(N)表示 N 的各位数字之和,如 S(484)=4+8+4=16,S(22)=2+2=4.如果一个正整数 x满足 S(x*x)=S(x)*S(x),我们称 x 为 Rabbit Nu ...

  2. 常州培训 day2 解题报告

    第一题: 题目大意: 给出一个M面的骰子,投N次,求最大期望值. 最大期望值的定义: 比如M=2,N=2, 那么 2次可以是 1,1,最大值为1: 1,2最大值为2: 2,1最大值为2: 2,2 最大 ...

  3. VS2010连接SQLite数据库

    Visual studio 2010及以上版本,连接SQLite数据库 1.在Sqlite开发站点下载SQLite的.exe安装包 Ctrl+F搜索这条语句:This is the only setu ...

  4. (DFS)hdoj1175:连连看

    题目链接 这道题被稍微改编当作过去年的期末上机题,也被直接放到了这次这一届的第二次练习赛.当初刚看到这道题时DFS并没有系统的学过,做起来极其费劲.现在学过之后开始实践练习,发现这道题真的是很水. 我 ...

  5. RM报表 文本框 自动换行 相关代码

    procedure TRMCustomMemoView.WrapMemo1(aAddChar: Boolean); var lCurHeight, lOneLineHeight, lMaxWidth: ...

  6. jstl c:choose>、<c:when>和<c:otherwise>标签

    <c:choose>.<c:when>和<c:otherwise>在一起连用,可以实现Java语言中的if-else语句的功能.例如以下代码根据username请求 ...

  7. SPOJ 10628 求树上的某条路径上第k小的点

    第k小,很容易会想到用主席树来解决 这里简单想一下树的转移过程 因为本身无向图形成一棵树,那么我们总以1为根,那么之后连下去的边对应的点建立的线段树总是在父亲节点对应的树上加上一个当前点对应位置出现的 ...

  8. C++封装、继承、多态

    C++封装继承多态总结 面向对象的三个基本特征 面向对象的三个基本特征是:封装.继承.多态.其中,封装可以隐藏实现细节,使得代码模块化:继承可以扩展已存在的代码模块(类):它们的目的都是为了--代码重 ...

  9. poj2769 暴力

    //Accepted 208 KB 157 ms //纯暴力 //vis数组初始化时要用多少设置多少,不然TLE #include <cstdio> #include <cstrin ...

  10. 自适应label的高度

    iOS7以下的系统可使用方法 //获得当前cell高度 CGRect frame = [self frame]; //文本赋值 self.introduction.text = text; //设置l ...