LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子;它具有旋转不变性和灰度不变性等显著的优点。它是首先由T. Ojala, M.Pietikäinen,和 D. Harwood 在1994年提出,用于纹理特征提取。而且,提取的特征是图像的局部的纹理特征;

1、LBP特征的描述

原始的LBP算子定义为在3*3的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3*3邻域内的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算子将会产生P2种模式。很显然,随着邻域集内采样点数的增加,二进制模式的种类是急剧增加的。例如:5×5邻域内20个采样点,有220=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种,这使得特征向量的维数更少,并且可以减少高频噪声带来的影响。

2、LBP特征用于检测的原理

显而易见的是,上述提取的LBP算子在每个像素点都可以得到一个LBP“编码”,那么,对一幅图像(记录的是每个像素点的灰度值)提取其原始的LBP算子之后,得到的原始LBP特征依然是“一幅图片”(记录的是每个像素点的LBP值)。

LBP的应用中,如纹理分类、人脸分析等,一般都不将LBP图谱作为特征向量用于分类识别,而是采用LBP特征谱的统计直方图作为特征向量用于分类识别。

因为,从上面的分析我们可以看出,这个“特征”跟位置信息是紧密相关的。直接对两幅图片提取这种“特征”,并进行判别分析的话,会因为“位置没有对准”而产生很大的误差。后来,研究人员发现,可以将一幅图片划分为若干的子区域,对每个子区域内的每个像素点都提取LBP特征,然后,在每个子区域内建立LBP特征的统计直方图。如此一来,每个子区域,就可以用一个统计直方图来进行描述;整个图片就由若干个统计直方图组成;

例如:一幅100*100像素大小的图片,划分为10*10=100个子区域(可以通过多种方式来划分区域),每个子区域的大小为10*10像素;在每个子区域内的每个像素点,提取其LBP特征,然后,建立统计直方图;这样,这幅图片就有10*10个子区域,也就有了10*10个统计直方图,利用这10*10个统计直方图,就可以描述这幅图片了。之后,我们利用各种相似性度量函数,就可以判断两幅图像之间的相似性了;

3、对LBP特征向量进行提取的步骤

(1)首先将检测窗口划分为16×16的小区域(cell);

(2)对于每个cell中的一个像素,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3*3邻域内的8个点经比较可产生8位二进制数,即得到该窗口中心像素点的LBP值;

(3)然后计算每个cell的直方图,即每个数字(假定是十进制数LBP值)出现的频率;然后对该直方图进行归一化处理。

(4)最后将得到的每个cell的统计直方图进行连接成为一个特征向量,也就是整幅图的LBP纹理特征向量;

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

===========================================================================

人脸识别之LBP (Local Binary Pattern)

1.算法简介

LBP是一种简单,有效的纹理分类的特征提取算法。LBP算子是由Ojala等人于1996年提出的,主要的论文是"Multiresolution gray-scale and rotation invariant texture classification with local binary patterns", pami, vol 24, no.7, July 2002。LBP就是"local binary pattern"的缩写。

从纹理分析的角度来看,图像上某个像素点的纹理特征,大多数情况下是指这个点和周围像素点的关系,即这个点和它的邻域内点的关系。从哪个角度对这种关系提取特征,就形成了不同种类的特征。有了特征,就能根据纹理进行分类。LBP构造了一种衡量一个像素点和它周围像素点的关系。

对图像中的每个像素,通过计算以其为中心的3*3邻域内各像素和中心像素的大小关系,把像素的灰度值转化为一个八位二进制序列。具体计算过程如下图所示,对于图像的任意一点Ic,其LBP特征计算为,以Ic为中心,取与Ic相邻的8各点,按照顺时针的方向记为 I0,I1,...,I7;以Ic点的像素值为阈值,如果 Ii 点的像素值小于Ic,则 Ii 被二值化为0,否则为1;将二值化得到的0、1序列看成一个8位二进制数,将该二进制数转化为十进制就可得到Ic点处的LBP算子的值。

基本的LBP算子只局限在3*3的邻域内,对于较大图像大尺度的结构不能很好的提取需要的纹理特征,因此研究者们对LBP算子进行了扩展。新的LBP算子LBP(P,R) 可以计算不同半径邻域大小和不同像素点数的特征值,其中P表示周围像素点个数,R表示邻域半径,同时把原来的方形邻域扩展到了圆形,下图给出了四种扩展后的LBP例子,其中,R可以是小数,对于没有落到整数位置的点,根据轨道内离其最近的两个整数位置像素灰度值,利用双线性差值的方法可以计算它的灰度值。

LBP(P,R)有2^p个值,也就是说图像共有2^p种二进制模型,然而实际研究中发现,所有模式表达信息的重要程度是不同的,统计研究表明,一幅图像中少数模式特别集中,达到总模式的百分之九十左右的比例,Ojala等人定义这种模式为Uniform模式,如果一个二进制序列看成一个圈时,0-1以及1-0的变化出现的次数总和不超过两次,那么这个序列就是Uniform模式 ,比如,00000000、00011110、00100001、11111111,在使用LBP表达图像纹理时,通常只关心Uniform模式,而将所有其他的模式归到同一类中。

人脸图像的各种LBP模式如下图所示,由图中可以看出,变化后的图像和原图像相比,能更清晰的体现各典型区域的纹理,同时又淡化了对于研究价值不大的平滑区域的特征,同时降低了特征的维数。比较而言,Uniform模式表现的更逼真,在人脸识别和表情识别应用中,都是采用这种模式。

在表情识别中,最常用的是把LBP的统计柱状图作为表情图像的特征向量。为了考虑特征的位置信息,把图像分成若干个小区域,在每个小区域里进行直方图统计,即统计该区域内属于某一模式的数量,最后再把所有区域的直方图一次连接到一起作为特征向量接受下一级的处理。

LBP算子利用了周围点与该点的关系对该点进行量化。量化后可以更有效地消除光照对图像的影响。只要光照的变化不足以改变两个点像素值之间的大小关系,那么LBP算子的值不会发生变化,所以一定程度上,基于LBP的识别算法解决了光照变化的问题,但是当图像光照变化不均匀时,各像素间的大小关系被破坏,对应的LBP模式也就发生了变化。

如果图像旋转了,那么纹理特征就旋转了,这时得到的2进制串也就旋转了,LBP值会相应变化。为了让LBP具有旋转不变性,将二进制串进行旋转。假设一开始得到的LBP特征为10010000,那么将这个二进制特征,按照顺时针方向旋转,可以转化为00001001的形式,这样得到的LBP值是最小的。无论图像怎么旋转,对点提取的二进制特征的最小值是不变的,用最小值作为提取的LBP特征,这样LBP就是旋转不变的了。当P=8时,能产生的不同的二进制特征数量是2^8个,经过上述表示,就变为36个。(我以为应当是2^8/8=32个)

代码:

code1:原始(正方形)LBP代码

1 lbpI=imread('D:/picture/lenagray.jpg')2 I = imresize(lbpI,[256 256]);3 [m,n,h] =size(I);4 if h==3

5 I =rgb2gray(I);6 end7 lbpI =uint8(zeros([m n]));8 for i = 2:m-1

9 for j = 2:n-1

10 neighbor = [I(i-1,j-1) I(i-1,j) I(i-1,j+1) I(i,j+1) I(i+1,j+1) I(i+1,j) I(i+1,j-1) I(i,j-1)] >I(i,j);11 pixel = 0;12 for k = 1:8

13 pixel = pixel + neighbor(1,k) * bitshift(1,8-k);14 end15 lbpI(i,j) =uint8(pixel);16 end17 end18 imshow(lbpI)

code2:圆形(旋转不变性)LBP代码

1 %2017-05-12学习LBP特征2

3 clc;4 clear;5

6 %读图操作7 img=imread('D:/picture/lenagray.jpg');8 [m,n]=size(img);9 subplot(121);10 imshow(img,[]);11 title('原图');12 %%

13 %求旋转不变LBP14 img_LBP_ri=zeros(m,n);15 for i=2:m-1

16 for j=2:n-1

17

18 code=zeros(1,8); %行向量,原始LBP特征编码19 code(1)=img(i-1,j-1)>img(i,j);20 code(2)=img(i-1,j)>img(i,j);21 code(3)=img(i-1,j+1)>img(i,j);22 code(4)=img(i,j+1)>img(i,j);23 code(5)=img(i+1,j+1)>img(i,j);24 code(6)=img(i+1,j)>img(i,j);25 code(7)=img(i+1,j-1)>img(i,j);26 code(8)=img(i,j-1)>img(i,j);27 for p=1:8

28 img_LBP_ri(i,j)=img_LBP_ri(i,j)+code(p)*2^(8-p); %从左上角开始,顺时针编码29 end30

31 %循环左移,移动k位相当于把开头的k个数放到最右边32 for k=1:7

33 code=[code(k+1:end) code(1:k)]; %移位之后的二进制编码,右移表达式 code=[code(end-k+1:end) code(1:end-k)]34 temp=0;35 for p=1:8

36 temp=temp+code(p)*2^(8-p);37 end38 if temp

43 end44 end45

46 subplot(122)47 imshow(img_LBP_ri,[]);48 title('旋转不变性LBP');

code3:正方形圆形对比LBP

1 #include "opencv2/core/core.hpp"

2

3

4

5 #include "opencv2/highgui/highgui.hpp"

6

7

8

9 #include

10

11 #include

12

13 #include

14

15

16

17 using namespacecv;18

19 using namespacestd;20

21

22

23 void elbp(Mat& src, Mat &dst, int radius, intneighbors)24

25 {26

27

28

29 for (int n = 0; n < neighbors; n++)30

31 {32

33 //采样点的计算

34

35 float x = static_cast(-radius * sin(2.0*CV_PI*n / static_cast(neighbors)));36

37 float y = static_cast(radius * cos(2.0*CV_PI*n / static_cast(neighbors)));38

39 //上取整和下取整的值

40

41 int fx = static_cast(floor(x));42

43 int fy = static_cast(floor(y));44

45 int cx = static_cast(ceil(x));46

47 int cy = static_cast(ceil(y));48

49 //小数部分

50

51 float ty = y -fy;52

53 float tx = x -fx;54

55 //设置插值权重

56

57 float w1 = (1 - tx) * (1 -ty);58

59 float w2 = tx * (1 -ty);60

61 float w3 = (1 - tx) *ty;62

63 float w4 = tx *ty;64

65 //循环处理图像数据

66

67 for (int i = radius; i < src.rows - radius; i++)68

69 {70

71 for (int j = radius; j < src.cols - radius; j++)72

73 {74

75 //计算插值

76

77 float t = static_cast(w1*src.at(i + fy, j + fx) + w2 * src.at(i + fy, j + cx) + w3 * src.at(i + cy, j + fx) + w4 * src.at(i + cy, j +cx));78

79 //进行编码

80

81 dst.at(i - radius, j - radius) += ((t > src.at(i, j)) || (std::abs(t - src.at(i, j)) < std::numeric_limits::epsilon())) <

83 }84

85 }86

87 }88

89 }90

91

92

93 void elbp1(Mat& src, Mat &dst)94

95 {96

97

98

99 //循环处理图像数据

100

101 for (int i = 1; i < src.rows - 1; i++)102

103 {104

105 for (int j = 1; j < src.cols - 1; j++)106

107 {108

109 uchar tt = 0;110

111 int tt1 = 0;112

113 uchar u = src.at(i, j);114

115 if (src.at(i - 1, j - 1) > u) { tt += 1 <

117 tt1++;118

119 if (src.at(i - 1, j) > u) { tt += 1 <

121 tt1++;122

123 if (src.at(i - 1, j + 1) > u) { tt += 1 <

125 tt1++;126

127 if (src.at(i, j + 1) > u) { tt += 1 <

129 tt1++;130

131 if (src.at(i + 1, j + 1) > u) { tt += 1 <

133 tt1++;134

135 if (src.at(i + 1, j) > u) { tt += 1 <

137 tt1++;138

139 if (src.at(i + 1, j - 1) > u) { tt += 1 <

141 tt1++;142

143 if (src.at(i - 1, j) > u) { tt += 1 <

145 tt1++;146

147

148

149 dst.at(i - 1, j - 1) = tt;//更正,之前是dst.at(i,j)=tt;

150

151 }152

153 }154

155 }156

157

158

159 intmain()160

161 {162

163 Mat img = cv::imread("D:/picture/lenagray.jpg", 0);164

165 namedWindow("image");166

167 imshow("image", img);168

169

170

171 intradius, neighbors;172

173 radius = 1;174

175 neighbors = 8;176

177

178

179 //创建一个LBP图谱

180

181 Mat dst = Mat(img.rows - 2 * radius, img.cols - 2 * radius, CV_8UC1, Scalar(0));182

183 elbp1(img, dst);184

185 namedWindow("normal");186

187 imshow("normal", dst);188

189

190

191 Mat dst1 = Mat(img.rows - 2 * radius, img.cols - 2 * radius, CV_8UC1, Scalar(0));192

193 elbp(img, dst1, 1, 8);194

195 namedWindow("circle");196

197 imshow("circle", dst1);198

199 cv::waitKey(0);200

201 }

提取lbp特征java代码_目标检测的图像特征提取之_LBP特征相关推荐

  1. 目标检测的图像特征提取

    转自:http://blog.csdn.net/zouxy09/article/details/7929348 作者:zouxy09 目标检测的图像特征提取之(一)HOG特征 1.HOG特征: 方向梯 ...

  2. php大作业含代码_目标检测 | 目标检测技巧大汇总(含代码与解读)

    点击上方"AI算法修炼营",选择加星标或"置顶" 标题以下,全是干货 来自 | 知乎作者丨初识CV来源丨https://zhuanlan.zhihu.com/p ...

  3. 目标检测的图像特征提取—Haar特征

    1.Haar-like特征 Haar-like特征最早是由Papageorgiou等应用于人脸表示,Viola和Jones在此基础上,使用3种类型4种形式的特征. Haar特征分为三类:边缘特征.线性 ...

  4. 提取lbp特征java代码_特征提取算法之LBP

    图像特征,图像纹理,图像频域等多种角度提取图像的特征. LBP,局部二值模式,局部特征描述算子,具有很强的纹理特征描述能力,具有光照不变性和旋转不变性.用python进行简单的LBP算法实验: 1 f ...

  5. 目标检测的图像特征提取之(一)Hog特征提取

    Hog特征实质是:梯度的统计信息,即针对边缘作特征提取 意义:目标的表象和形状 转载于zouxy09大神的文章,加上自己些微的理解和应用! http://blog.csdn.net/zouxy09/a ...

  6. Haar特征和级联分类器目标检测介绍及应用

    文章目录 Haar特征和级联分类器目标检测介绍及应用 1. Haar特征 2. 级联分类器 3. 实现步骤 4.尝试训练自己的级联分类器 4. 应用示例 Haar特征和级联分类器目标检测介绍及应用 H ...

  7. 即插即涨2-3%!AC-FPN:用于目标检测的注意力引导上下文的特征金字塔网络

    关注 点击关注上方"AI深度视线",并"星标"公号 技术硬文,第一时间送达! 精彩内容 AC-FPN--用于目标检测的注意力引导上下文的特征金字塔网络 ,即插即 ...

  8. 10行代码实现目标检测,请收下这份教程

     翻译 | 林椿眄 编辑 | 阿司匹林 出品 | AI科技大本营(公众号ID:rgznai100) 作为人工智能的一个重要领域,计算机视觉是一门可以识别并理解图像和场景的计算机及软件系统科学.该领 ...

  9. 10行代码实现目标检测

    2019独角兽企业重金招聘Python工程师标准>>> 作为人工智能的一个重要领域,计算机视觉是一门可以识别并理解图像和场景的计算机及软件系统科学.该领域主要包括图像识别,目标检测, ...

最新文章

  1. QPS/TPS/并发量/系统吞吐量概念和公式
  2. AbstractBeanFactory 生产Bean 实例对象
  3. 计算矩阵中全1子矩阵的个数
  4. python创建字典和包的区别_python之路—模块和包
  5. scipy.stats —— 概率、随机变量与分布
  6. 许多自己正在总结的东东
  7. HCIE-Security心得
  8. 微信小程序:动画效果集合
  9. 链家上海2018年9月二手房
  10. python写的ROS激光雷达扇形滤波
  11. 7-8 哈利·波特的考试,7-9 旅游规划,7-10 公路村村通
  12. (MATLAB/C)高斯拟合法求光斑中心
  13. 推荐 :数据可视化与信息可视化浅谈
  14. Python数据分析与展示教程(北理工 嵩天教授)——展示数据基本方法
  15. 微信公众号开发之编码问题
  16. Android studio调取支付宝健康码
  17. Oracle11g新特性之Replay a captured workload 捕获工作负载新环境重放负载测试压力
  18. 什么是HTTP? HTTP和HTTPS的区别?
  19. 一文彻底了解SSD1306驱动0.96寸OLED
  20. 解决AXmath公式编号从0开始的问题

热门文章

  1. office2016和office visio2016同时安装包你一次成功
  2. 【计算机网络】什么是 A、B、C 类地址?什么是子网掩码?
  3. Jpa第一话 -- Springboot集成Jpa和Mybatis以及Jpa的最全使用
  4. 华硕触摸板关闭后AsusTPCenter.exe占用太多cpu资源
  5. 数据库课程设计作业报告
  6. Python自动化办公:读取pdf文档
  7. 大数据思维养成从认识大数据的本质开始
  8. IOS开发之——屏幕适配-AutoLayout布局实现(02)
  9. 安装SQLyog社区版教程
  10. 服务器和kad正在连接,P2P连不上kad网络怎么解决?P2P连不上kad网络的处理方法教程详解...