此文章的完整代码网址:

https://blog.csdn.net/Mimido_luoluo/article/details/108445700

LBP直方图

1.1 LBP直方图数据记录的介绍

LBP可以提取图片的纹理特征并且保存为一系列数字。通常以某个像素点为中心,观察其八邻域是比中心像素大还是小,若以center表示为中心像素,以pixel(i)表示为center像素点的各个八邻域像素,其计算为:

最后按顺序将这7个数字连在一起,可作为这个像素点的LBP特征值,最终,每个像素点的LBP特征值按照原像素的位置排列,可以表示成一个图片,即通常所使用的LBP图谱。图谱的每个像素值都是对应像素的LBP特征值,即8位二进制数,一般转换为0~255的十进制数字作为图谱的像素值。

但是实际使用时,例如分类器中使用的是LBP特征值中不同数值的个数。最简单的过程是,对一张图片提取LBP特征值后得到一系列0~ 255的数字,计算0~ 255各个数字的个数,再进行归一化处理后,便可送到分类器中使用,而这个结果用直方图比图谱表现得更为直观。

如果从一张图片得到256组数据,即256维的向量来作为分类器使用的数据,这样维度过小,能够提供的数据也会少,此时会缺失掉包括位置信息等很多的信息,导致分类的效果不理想。因此可以利用分块提取LBP特征值的方法,即将一张图片分成5×5份,或者16×16份等其他份数的多个小区域,再对每个区域进行LBP特征计算,这样每一个小的区域都会得到一个256维的向量,最后将这些小区域的向量都串联到一起,得到一个高维的大向量,此时分类的结果会更为准确。

由于分块处理图片提取LBP特征后,维度往往会很大,例如一个图片被分为5×5的小份,一共有25份,每个小份可以提取256维向量,此时,整张图片的LBP特征向量维数为5×5×256=6400维。因此需要进行降维处理,便用到Uniform LBP的概念,即LBP等价模式,可以保证在不失真的前提下,大大降低特征向量的维度。经过统计,LBP特征中Uniform LBP占85~90%,而Uniform LBP只有58维。不过,还需要加一维来表示那些不是Uniform LBP的向量,因此可以由256维降到59维,这个图片的LBP特征维数被降到5×5×59=1475维。

1.2 简单的LBP直方图

本部分通过使用python自行编写原始LBP特征提取的代码,对一张人脸图片进行LBP特征提取,最后将提取结果归一化为一个直方图。

使用到的库如下:
matplotlib.pyplot 2D绘图 直方图的绘制
numpy 矩阵计算 图片数据的计算
cv2 图像处理 读取图片并处理

本程序中,步骤为:
STEP 1:读取图片,将图片灰度化,这个过程称为预处理;
STEP 2:调用已写好的函数LBP_Cal(src), 计算图片的LBP特征值并保存为dst变量,直接使用cv2库的imshow函数来显示dst可以得到该图片的LBP图谱;
STEP 3:通过统计dst中各个数字出现的次数并且除以总次数从而归一化,保存为rate变量,此时调用matplotlib.pyplot库中的bar函数可以显示LBP直方图。

其中,LBP_Cal(src)是用来计算LBP特征的子函数,输入变量src是灰度图片,函数返回值是dst即LBP图谱。若以center作为计算的中心像素,以pixel(i)作为center的八邻域,八邻域以pixel(i)表示为:

pixel(1) pixel(2) pixel(3)
pixel(4) center pixel(5)
pixel(6) pixel(7) pixel(8)

以i作为迭代变量,迭代值为1~8表示center的八邻域中8个像素,当i=9时结束循环。其计算过程为:
STEP 1:读取灰度图片,并以src(1,1)作为第一个中心像素center开始;
STEP 2:将迭代变量i设为1,记LBP中间计算向量为LBPtemp,初始值为0;
STEP 3:计算center的八邻域的第i个像素的LBP值,即pixel_LBP(i),并使LBPtemp的第(9-i)位数字等于pixel_LBP(i).
若i未迭代至i=9,则循环STEP2、STEP3.

LBPtemp的赋值使用了按位逻辑与移位算法。首先计算好pixel_LBP(i)后将pixel_LBP(i)左移(8-i)位,表示第i个相邻像素的LBP值,再与LBPtemp进行按位或操作。例如,i=1时,计算邻域pixel(1)的LBP值为1,则pixel_LBP(1)=1,将其左移(8-1=7)位,得到数字为pixel_LBP(1)=10000000,此时的1处于该数字的从右向左第八位,由于LBPtemp的初始值为00000000,按位或操作得到LBPtemp=10000000,此时pixel(1)的LBP计算过程完毕。

基于上述过程,便可编写出原始LBP特征的python代码。此代码的运行结果如下:

1.3 图像分块后得到的LBP直方图

该程序仍然使用上述简单LBP直方图算法,预处理过程中需先将图片进行分割。
由于图片大小为512×512,为计算方便将图片分为8×8共64块,其中一块的大小为64×64.其分块示意图如图1.3.1.

对一个小区域进行LBP特征提取后,可以得到LBP值共64×64=4096个,而全图片共64个相同的小区域,因此LBP值共有4096×64=262144个。
由于维度过多,运算庞大,在这里不做直方图图片。

下图是运行结果的数据大小:

这个4096×64的数组是整个图片的所有LBP特征值。一个小区域64×64个特征值,将所有小区域的特征值矩阵按列合并,共64个小区域,因此该数组的行数为64×64 = 4096,而列数则不变,仍是64列。制作直方图时,以64×64为一个迭代单位,一次迭代制作一个共有256个长方体的直方图,共迭代64次,因此直方图的横坐标共256×64 = 16384个数据点,即16384个长方体,而上节所述的简单方法仅256个。相比于256维的LBP特征,16384维的LBP特征能提供相对更多的信息,但是这并不利于分类器运算速度的提升。

1.4 Uniform LBP的实现

Uniform LBP等价模式的原理是,根据跳变来确定是哪一类。
等价模式类为,计算0到1或1到0的跳变,跳变0次、跳变1次、跳变2次,共有58个情况;跳变超过2次的,称为其他情况,是1个情况,因此LBP特征变为58+1=59维。

若8个数字都一样,即0000 0000与1111 1111,跳变次数为0;
若8个数字中有1个0,则根据0不同位置,有8种组合,即0111 1111、1011 1111、1101 1111、1110 1111、1111 0111、1111 1011、1111 1101、1111 1110;
若8个数字中有2个0,若要保证跳变不超过2次,这两个0只能是相邻的,因此也是有8种组合:0011 1111、1001 1111、1100 1111、1110 0111、1111 0011、1111 1001、1111 1100、0111 1110;
若8个数字中有3个0、4个0、…、7个0,这些0都要相邻,才能保证跳变不超过2次,因此,每种情况都有8种组合,从而,以上情况共有8×7=56种。

综上所有情况相加,2+56=58种。其余情况则统称为混合类,统统放到同一维中,即第59维。这59种类别中,前58种按照二进制数所对应的值按照从小到大编码为1~58,第59类则编码为0.

对一个图片,首先计算其LBP特征值。然后观察每一个LBP特征值都属于哪一类别,之后,将该位置的数字改为类别数。例如,0000 0000对应第1类、0000 0001对应第2类、… 、1111 1111对应第58类,而1010 1101之类则对应第0类。最后得到的是一张由类别编码数替换后的灰色图片。如果将各个数字进行计数,便可总结成一个维度为59的直方图。

本算法的python实现流程如下:
STEP 1:读取图片并转换为灰度图像;
STEP 2:将灰度图像输入到子函数uniform_LBP(img)中,进行计算;
STEP 3:将得到的uniform_LBP值进行归一化处理并做成直方图。

其中,子函数uniform_LBP(img)中,首先建立了一个长度为8的数列Code,用以记录8位二进制数的每一位数字,即8位的特征值,方便后来的计算跳变次数;以row和col作为图片的行列迭代变量,建立for双循环遍历图片的各个中心像素,row和col的范围都是1~511;以dst作为输出变量,输出的是一个59维的均值LBP图谱。

STEP 1:计算src[row,col]像素的LBP特征值,并且保存到Code变量中;
STEP 2:设置记录跳变的变量count=0,以i=0,1,…,8为迭代变量,从i=0开始遍历数列Code,若发生跳变,则变量count加1,当i=8时停止迭代;
STEP 3:若count > 2,则令输出dst[row,col]=0;若count ≤ 2,则寻找该LBP值属于1~58的哪一个类别,并且将该类别号作为输出dst[row,col]的值。

若row和col均未迭代到511,则循环步骤STEP 1~STEP 3. 最终此函数输出dst数组。

基于上述过程,可以写出Uniform LBP的python运行代码,输入图1.2.1图片,其运行结果如下:

由此可见,Uniform LBP的确相当大地降了维度,在不失真的条件下使计算量大大减少,以下是原始LBP直方图和Uniform LBP直方图的对比:
从组合对比图中可以看出来,直方图中,虽然Uniform LBP的结果维度很少,是59维,但是大致的数据分布是相似的,并未过多地失真;而图谱中,由于0~59像素值的灰度图整体上是偏暗的,但是纹理特征与原始LBP图谱的纹理特征相同,也没有过多的失真现象出现。

原始LBP/Uniform LBP编程实现与直方图相关推荐

  1. 【Linux网络编程】原始套接字编程

    原始套接字编程和之前的 UDP 编程差不多,无非就是创建一个套接字后,通过这个套接字接收数据或者发送数据.区别在于,原始套接字可以自行组装数据包(伪装本地 IP,本地 MAC),可以接收本机网卡上所有 ...

  2. linux sock_raw原始套接字编程

    sock_raw原始套接字编程可以接收到本机网卡上的数据帧或者数据包,对与监听网络的流量和分析是很有作用的.一共可以有3种方式创建这种socket   1.socket(AF_INET, SOCK_R ...

  3. Linux网络编程——原始套接字编程

    Linux网络编程--原始套接字编程 转自:http://blog.csdn.net/tennysonsky/article/details/44676377 原始套接字编程和之前的 UDP 编程差不 ...

  4. 原始套接字编程”中的Teardrop代码编程

    原始套接字编程"中的Teardrop代码编程 (1)实验代码: #include <stdio.h> #include <stdlib.h> #include < ...

  5. 原始套接字编程 | ping程序实现

    [实验目的] 熟悉原始套接字编程的基本流程 理解ping程序的实现机制 理解ICMP协议的基于作用和报文格式. 完成原始套接字的配置. [实验内容] 1.构造ICMP协议首部结构 2.构造IC ...

  6. 原始套接字编程(1)

    Linux下原始套接字的原理 创建原始套接字: socket(AF_NET, SOCK_RAW, protocol); 1. 参数protocol用来致命所接收的协议包,如果是像IPPROTO_TCP ...

  7. Teardrop原始套接字编程

    目录 一.含义介绍 二.Teardrop代码编程 参考 一.含义介绍 1.什么是原始套接字 原始套接字的含义就是在传输层之下使用的套接字,它提供了一些 TCP 和 UDP 套接字无法提供的功能,即: ...

  8. Windows平台的原始套接字编程的知识点概要(备忘)

    其实从大学学习了C语言后,翻看整本教材只有C语言的语法,根本没有网络编程相关的任何内容,现在回想起来,都记不起自己何时在哪本书上学习了套接字编程,说起TCP.UDP,能知道他们的区别,相关的编程的&q ...

  9. 105-网络编程——第七章原始套接字编程(上)

    1.原始套接字是允许访问底层传输协议的一种套接字类型,提供了普通套接字所不具备的功能,能够对网络数据包进行某种程度的控制操作 因此原始套接字通常用于开发简单网络性能监视程序以及网络探测.网络攻击 2. ...

最新文章

  1. 微软云创益大赛获奖团队风采:做一个中国特色的.Net源代码社区
  2. sdut 3363 驴友计划
  3. linux防火墙 限制端口,Linux开启防火墙并限制开放端口
  4. 【项目管理】采购管理
  5. Python Django 多对多表设计
  6. 使用二进制包安装MariaDB
  7. 三、“涤纶纤维和棉纤维两组分纤维在涤/棉混纺织物燃烧过程中有着明显的物理相互作用和化学相互作用”,解释这两种作用。
  8. LeetCode 258. Add Digits
  9. Wince6.0应用开发:二、模拟器的使用
  10. Javascript之旅——第十站:为什么都说闭包难理解呢?
  11. iOS 网络/本地 图片 按自定义比例缩放 不失真 方法
  12. td中使用overflow:hidden; 无效解决方案
  13. pycharm安装scrapy失败_大数据开发神器——Scrapy 框架(读懂Spider流程图)
  14. 简述导线平差计算的五个步骤_结点导线如何平差
  15. js操作Cookie,js设置Cookie值,js读取Cookie值
  16. Flask-MDict搭建在线Mdict词典服务
  17. h61 nvme硬盘_免装系统!机械硬盘系统迁移至固态硬盘技巧
  18. Bootstrap(一)
  19. 小米摄像头有onvif协议_小米8SE、魅族16T、荣耀畅玩9A对比
  20. FMVP詹姆斯,王者归来!英雄实至名归!

热门文章

  1. 计算机网络详解--套接字编程
  2. 网站发布一般步骤以及解决方法
  3. spring配置hibernate的sessionFactory
  4. hive sql报错:SQL 错误 [10004] [42000]: Error while compiling statement: FAILED: SemanticException [Error
  5. DirectShow2
  6. 有哪些可以提高网站排名的更有效的SEO优化方法?
  7. bootstrap使用及解析
  8. HTK 安装、编译以及测试——Ubuntu 14.04
  9. 网站本地化翻译、建设助力企业拓展全球市场 安睿杰翻译
  10. 销毁echart的图表实例