机器视觉基础之——LBP特征描述算子

38 篇文章 0 订阅
32 篇文章 0 订阅

一、图像纹理特征简介
纹理是一种反映图像中的同质的一种视觉特征,它体现了物体表面的结构组织排列属性。纹理特征具有三大标志:某种局部序列性不断重复、非随机排列、纹理区域内大致为均匀的统一体。纹理不同于灰度、颜色等图像特征,他通过像素及其周围空间邻域的弧度分布来表现,纹理具有局部性,当局部纹理重复出现时就是全局纹理信息。

纹理特征体现全局性质时,描述了图像或图像区域所对应景物的表面性质。但由于纹理只是一种物体表面的特性,并不能完全反映出物体的本质属性,所以仅仅利用纹理特征是无法获得高层次图像的内容的。

二、LBP特征描述算子
LBP特征描述算子是指局部二值模型(Location Binary Pattern,LBP)是一种图像纹理的描述算子。改进后的LBP具有灰度不变性和旋转不变性等优点,常应用于人脸识别和目标检测。
2.1算法理论介绍
1 .LBP原理介绍

  LBP特征用图像的局部领域的联合分布 T T T 来描述图像的纹理特征,如果假设局部邻域中像素个数为 P ( P > 1 ) P(P >1) P(P>1),那么纹理特征的联合分布 T T T 可以表述成:
T = t ( g c , g 0 , … , g p − 1 ) p = 0 , … , P − 1 (2-1) T=t\left(g_{c}, g_{0}, \ldots, g_{p-1}\right) \quad p=0, \ldots, P-1\tag{2-1} T=t(gc,g0,,gp1)p=0,,P1(2-1)
  其中, g c g_c gc 表示相应局部邻域的中心像素的灰度值, g p g_p gp 表示以中心像素圆心,以R为半径的圆上的像素的灰度值。
  假设中心像素和局部邻域像素相互独立,那么这里可以将上面定义式写成如下形式:
在这里插入图片描述

其中 t ( g c ) t(g_c) t(gc)决定了局部区域的整体亮度,对于纹理特征,可以忽略这一项,最终得到:
T ≈ t ( g 0 − g c , … , g p − 1 − g c ) p = 0 , … , P − 1 (2-3) T \approx t\left(g_{0}-g_{c}, \ldots, g_{p-1}-g_{c}\right) \quad p=0, \ldots, P-1\tag{2-3} Tt(g0gc,,gp1gc)p=0,,P1(2-3)
  上式说明,将纹理特征定义为邻域像素和中心像素的差的联合分布函数,因为 g p − g c g_p − g_c gpgc是基本不受亮度均值影响的,所以从上式可以看出,此时统计量T 是一个跟亮度均值,即灰度级无关的值。
  最后定义特征函数如下:
在这里插入图片描述

定义灰度级不变LBP为:
L B P P , R = ∑ p = 0 P − 1 s ( g p − g c ) 2 p (2-5) L B P_{P, R}=\sum_{p=0}^{P-1} s\left(g_{p}-g_{c}\right) 2^{p}\tag{2-5} LBPP,R=p=0P1s(gpgc)2p(2-5)
  即二进制编码公式
由此可知:LBP算子的基本思想是将中心像素的灰度值作为一个阈值,将其邻域内的像素点灰度值进行比较,从而得到二进制编码表示,来表示局部纹理特征。
邻域的类型可分为四邻域、D邻域、八邻域,
四邻域:该像素点的上下左右四个位置;
D领域:该像素点斜对角线上的四个相邻位置。
八邻域:四邻域与D邻域的并集。基本的LBP算子考虑的是像素的八邻域。
LBP表示方法有一个较为明显的特点,它不容易收到图像整体会读线性变化的影响。也就是说,当图像由于光线的影响使得整体灰度值发生线性均匀变化时,其LBP特征编码是不变的。换句话说,它并不在意整体的灰度变化,而是关注像素之间的相对灰度改变。

通俗解释:
  原始的LBP算子定义在像素 3 X 3 3X3 3X3的邻域内,以邻域中心像素为阈值,相邻的8个像素的灰度值与邻域中心的像素值进行比较,若周围像素大于中心像素值,则该像素点的位置被标记为1,否则为0。这样, 3 X 3 3X3 3X3邻域内的8个点经过比较可产生8为二进制数,将这8位二进制数依次排列形成一个二进制数字,这个二进制数字就是中心像素的LBP值,LBP值共有28种可能,因此LBP值有256种可能。中心像素的LBP值反映了该像素周围区域的纹理信息。

注意:计算LBP特征的图像必须是灰度图,如果是彩色图,需要先转换成灰度图

在这里插入图片描述
上述过程仅仅是对一个像素点的处理过程,结果是一个LBP“编码”。
对于某幅图像而言,需要进行逐行扫描完成每个像素点数值的更新。我们将采用分块的形式进行编码。其编码过程如下:
假设此时有一幅100*100大小的图像。
(1)在初始化时,将该图划分为10×10 个Block,其中每个Block的大小为10×10。
(2)对每个Block的像素点提取其LBP特征,并建立一个计算某个“数字”出现的频率统计直方图。
(3)结束时,将生成10×10个统计直方图,选择性地对直方图进行规范化处理。
(4)连接所有小块的(规范化的)直方图,整合后构成了整个窗口的特征向量,用来描述这幅图片。
(5)得到特征向量之后,就可以使用各类算法对该图像进行特定的处理了
2 圆形LBP算子
  基本的 LBP算子的最大缺陷在于它只覆盖了一个固定半径范围内的小区域,这显然不能满足不同尺寸和频率纹理的需要。为了适应不同尺度的纹理特征,并达到灰度级和旋转不变性的要求,Ojala等对 LBP算子进行了改进,将 3×3邻域扩展到任意邻域,并用圆形邻域代替了正方形邻域,改进后的 LBP算子允许在半径为 R的圆形邻域内有任意多个像素点。从而得到了诸如半径为R的圆形区域内含有P个采样点的LBP算子,表示为 L B P P R LBP^{R}_P LBPPR
在这里插入图片描述
对于给定中心点 ( x c , y c ) (x_c,y_c) (xc,yc),其邻域像素位置为 ( x p , y p ) (x_p,y_p) (xp,yp) p ∈ P p∈P pP,其采样点 ( x p , y p ) (x_p,y_p) (xp,yp)用如下公式计算:
在这里插入图片描述
 R是采样半径,p是第p个采样点,P是采样数目。如果近邻点不在整数位置上,就需要进行插值运算。
插值运算详见
LBP特征描述算子
OpenCV框架与图像插值算法](https://blog.csdn.net/weixin_39940512/article/details/105343418)
3 LBP旋转不变性及等价模式
  LPB特征是灰度不变,但不是旋转不变的,同一幅图像,进行旋转以后,其特征将会有很大的差别,影响匹配的精度。Ojala在LBP算法上,进行改进,实现了具有旋转不变性的LPB的特征。
  实现方法:不断旋转圆形邻域得到一系列初始定义的LPB值,取最小值作为该邻域的值。
L B P P R r i = min ⁡ ( R O R ( L B P P , R r i , i ) ∣ i = 0 , 1 , … , P − 1 ) (2-7) L B P_{P R}^{ri}=\min \left(R O R\left(L B P_{P, R}^{ri}, i\right) | i=0,1, \ldots, P-1\right)\tag{2-7} LBPPRri=min(ROR(LBPP,Rri,i)i=0,1,,P1)(2-7)
  其中 L B P P R r i L B P_{P R}^{ri} LBPPRri表示具有旋转不变性的LBP特征。 R O R ( x , i ) ROR(x, i) ROR(x,i)为旋转函数,表示将 x x x右循环 i i i位。
如下图所示,黑点代表0,白点代表1,假设初始的灰度值为255。经过7次旋转,得到7个不同的二进制序列,并分别转换为相应的十进制数,最后取到最小值“15”为最终中心点的LBP值,且序列为“00001111”。
在这里插入图片描述
等价模式:
  一个LBP算子可以产生不同的二进制模式,对于 L B P p R LBP^{R}_p LBPpR将会产生 2 p 2^p 2p种模式。比如 7 ∗ 7 7*7 77邻域内有 2 36 2^{36} 236种模式。如此多的二值模式对于信息的提取和识别都是不利的。
  Ojala等认为,在实际图像中,绝大多数LPB模式最多只包含两次从1到0或从0到1的跳变。
等价模式:当某个局部二进制模式所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该局部二进制模式所对应的二进制就称为一个等价模式。
  比如:00000000,11111111,11110010,10111111都是等价模式。
  检查某种模式是否是等价模式:
U ( G p ) = ∣ s ( g p − 1 − g c ) − s ( g 0 − g c ) ∣ + ∑ p = 1 P − 1 ∣ s ( g p − g c ) − s ( g P − 1 − g c ) ∣ U\left(G_{p}\right)=\left|s\left(g_{p_{-1}}-g_{c}\right)-s\left(g_{0}-g_{c}\right)\right|+\sum_{p=1}^{P_{-1}}\left|s\left(g_{p}-g_{c}\right)-s\left(g_{P-1}-g_{c}\right)\right| U(Gp)=s(gp1gc)s(g0gc)+p=1P1s(gpgc)s(gP1gc)
  将其和其移动一位后的二进制模式按位相减。并绝对值求和。若U ( G p ) \left(G_{p}\right) (Gp) 小于等于2,则为等价模式。
  混合模式:除了等价模式之外的称为混合模式。
  改进后的LPB模式数由2 p ^{p} p(p为邻域集内的采集点数 ) 降维为 p ∗ ( p − 1 ) + 2 p*(p-1)+2 p(p1)+2 。维数减少,可以降低高频噪声的影响。Ojala认为等价模式占总模式中的绝大数。下图 ( a ), ( b ), ( c )等价模式分别占88%,93%和76%。
在这里插入图片描述可以通过低通滤波的方法来增强等价模式所占的比例。图( c )经过高斯滤波后,其等价模式所占比可以增加到90%。
判断一个二进制模式是否为等价模式最简单的办法就是将LBP值与其循环移动一位后的值进行按位相与,计算得到的二进制数中1的个数,若个数小于或等于2,则是等价模式;否则,不是。除了等价模式以外的模式都归一类,称为混合模式类,例如10010111(共四次跳变)。

4 人脸检测流程
  人脸检测过程采用多尺度滑窗搜索方式,每个尺度通过一定步长截取大小为20x20的窗口,然后将窗口放到分类器中进行是不是人脸的判决,如果是人脸则该窗口通过所有分类器;反之,会在某一级分类器被排除。
在这里插入图片描述
基于OpenCV的实现

#coding:utf-8
import cv2 as cv

# 读取原始图像
img= cv.imread('*.png')
#face_detect = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

face_detect = cv.CascadeClassifier("lbpcascade_frontalface_improved.xml")
# 检测人脸
# 灰度处理
gray = cv.cvtColor(img, code=cv.COLOR_BGR2GRAY)

# 检查人脸 按照1.1倍放到 周围最小像素为5
face_zone = face_detect.detectMultiScale(gray, scaleFactor = 2, minNeighbors = 2) # maxSize = (55,55)
print ('识别人脸的信息:\n',face_zone)

'''
def detectMultiScale(self, image, scaleFactor=None, minNeighbors=None, flags=None, minSize=None, maxSize=None)
params:
  1. scaleFactor: 指定每个图像比例缩小多少图像
  2. minNeighbors: 指定每个候选矩形必须保留多少个邻居,值越大说明精度要求越高
  3. minSize:检测到的最小矩形大小
  4. maxSize: 检测到的最大矩形大小
'''

# 绘制矩形和圆形检测人脸
for x, y, w, h in face_zone:
    # 绘制矩形人脸区域
    cv.rectangle(img, pt1 = (x, y), pt2 = (x+w, y+h), color = [0,0,255], thickness=2)
    # 绘制圆形人脸区域 radius表示半径
    cv.circle(img, center = (x + w//2, y + h//2), radius = w//2, color = [0,255,0], thickness = 2)

# 设置图片可以手动调节大小
cv.namedWindow("Easmount-CSDN", 0)

# 显示图片
cv.imshow("Easmount-CSDN", img)

# 等待显示 设置任意键退出程序
cv.waitKey(0)
cv.destroyAllWindows()

原始图像(来源于网络)
在这里插入图片描述
识别结果
在这里插入图片描述
自己从网上找了好多图片,发现只有在人脸比较正的情况下才能识别,具体参数调节还有待学习。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值