LBP特征原理与人脸检测

LBP特征原理

原始LBP特征

某个像素的LBP值定义为:将其灰度值作为一个阈值,其周围像素值与之相比,比中间点像素值大(或者相等)的记为1,小的记为0,这样就得到二值图,然后按顺序排列得到八位二进制串,即中间像素点的LBP值。
在这里插入图片描述
上图是一个八邻域LBP特征实例,中间点lbp值为10001111,转换为十进制是241.
注意这里的计算LBP的顺序并没有硬性要求,只是一个量化公式,在同一处理中保持相同的顺序即可。

将上述思想量化,给出LBP特征的计算公式。
如果假设某局部邻域中像素个数为 P ( P > 1 ) P(P >1) P(P>1)(不限于8邻域大小),中心像素和局部邻域像素相互独立,那么其联合分布 T T T 可以表述成:
T = t ( g c , g 0 − g c , … , g p − 1 − g c ) p = 0 , … , P − 1   ≈ t ( g c ) t ( g 0 − g c , … , g p − 1 − g c ) (1) \begin{aligned} T &=t\left(g_{c}, g_{0}-g_{c}, \ldots, g_{p-1}-g_{c}\right) \quad p=0, \ldots, P-1 \ & \approx t\left(g_{c}\right) t\left(g_{0}-g_{c}, \ldots, g_{p-1}-g_{c}\right) \end{aligned}\tag{1} T=t(gc,g0gc,,gp1gc)p=0,,P1 t(gc)t(g0gc,,gp1gc)(1)

其中, g c g_c gc 表示相应局部邻域的中心像素的灰度值, g p g_p gp 表示周围像素的灰度值。由于
t ( g c ) t(g_c) t(gc)决定局部区域的整体亮度,对于纹理特征,可以忽略这一项,最终得到:

T ≈ t ( g 0 − g c , … , g p − 1 − g c ) p = 0 , … , P − 1 (2) T \approx t\left(g_{0}-g_{c}, \ldots, g_{p-1}-g_{c}\right) \quad p=0, \ldots, P-1\tag{2} Tt(g0gc,,gp1gc)p=0,,P1(2)
纹理特征定义为邻域像素和中心像素的差的联合分布函数。

最后定义灰度级不变LBP为:
L B P P , R = ∑ p = 0 P − 1 s ( g p − g c ) 2 p (3) L B P_{P, R}=\sum_{p=0}^{P-1} s\left(g_{p}-g_{c}\right) 2^{p}\tag{3} LBPP,R=p=0P1s(gpgc)2p(3)
即二进制编码公式。其中 x ≥ 0 x \geq 0 x0时,s=1;x<0时,s=0.

圆形LBP特征

原始的LBP只能在中心像素点周围选取一固定大小邻域进行计算,为了克服这个缺点,Ojala等对 LBP算子进行了改进,将 3×3邻域扩展到任意邻域,并用圆形邻域代替了正方形邻域,表示为 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)用如下公式计算:

x p = x c + Rcos ⁡ ( 2 π p P ) y p = y c + Rsin ⁡ ( 2 π p P ) \begin{array}{l} x_{p}=x_{c}+\operatorname{Rcos}\left(\frac{2 \pi p}{P}\right) \quad y_{p}=y_{c}+\operatorname{Rsin}\left(\frac{2 \pi p}{P}\right) \end{array} xp=xc+Rcos(P2πp)yp=yc+Rsin(P2πp)

R是采样半径,p是第p个采样点,P是采样数目。

即:半径为R的圆形区域内含有P个采样点的LBP算子

1.处在方格中心的邻域点(左、上、右、下4个黑点):以该点所在方格的像素值作为它的值
2.不在方格中心的邻域点(斜45°方向的4个黑点):线性插值法确定其值。
在这里插入图片描述
如图,在空心点的上方,距离 2 − 2 2 2−2\sqrt{2} 222 处,有一个十叉点1,下方还有一个十叉点2。所以分别计算这两个十叉点1和2的水平插值。
其中点1的值根据与之处于同一行的 I ( i − 2 , j − 2 ) I(i−2,j−2) I(i2,j2)以及 I ( i − 2 , j − 2 ) I(i−2,j−2) I(i2,j2)的线形插值得到:
v a l u e ( 1 ) = I ( i − 2 , j − 2 ) + ( 2 − 2 2 ) × ( I ( i − 2 , j − 1 ) − I ( i − 2 , j − 2 ) ) value(1)=I(i−2,j−2)+(2−2\sqrt{2})×(I(i−2,j−1)−I(i−2,j−2)) value(1)=I(i2,j2)+(222 )×(I(i2,j1)I(i2,j2))
同理计算出点2的值如下:
v a l u e ( 2 ) = I ( i − 1 , j − 2 ) + ( 2 − 2 2 ) × ( I ( i − 1 , j − 1 ) − I ( i − 1 , j − 2 ) ) value(2)=I(i−1,j−2)+(2−2\sqrt{2})×(I(i−1,j−1)−I(i−1,j−2)) value(2)=I(i1,j2)+(222 )×(I(i1,j1)I(i1,j2))
再计算出点1和点2竖直的线性插值:
v a l u e = v a l u e ( 1 ) + ( 2 − 2 2 ) × ( v a l u e ( 2 ) − v a l u e ( 1 ) ) value=value(1)+(2−2\sqrt{2})×(value(2)−value(1)) value=value(1)+(222 )×(value(2)value(1))

LBP旋转不变模式及等价模式

旋转不变模式

从 LBP 的定义可以看出,LBP 算子是灰度不变的(计算与中心像素的灰度差值),但却不是旋转不变的,图像发生旋转后,相邻像素的位置发生改变,就会得到不同的 LBP值。

对此,Maenpaa等人又将 LBP算子进行了扩展,提出了具有旋转不变性的 LBP 算子,即不断旋转圆形邻域得到一系列初始定义的 LBP值,取其最小值作为该邻域的 LBP 值。
在这里插入图片描述

上图给出了求取旋转不变的 LBP 的过程示意图,图中算子下方的数字表示该算子对应的 LBP值,图中所示的 8 种 LBP模式,经过旋转不变的处理,最终得到的具有旋转不变性的 LBP值为 15。
计算公式如下:
L B P P R r i = min ⁡ ( R O R ( L B P P , R r i , i ) ∣ i = 0 , 1 , … , P − 1 ) 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) LBPPRri=min(ROR(LBPP,Rri,i)i=0,1,,P1)
其中 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位。

等价模式

一个LBP算子可以产生不同的二进制模式,对于半径为R的圆形区域内含有P个采样点的LBP算子将会产生 2 P 2^P 2P种模式。例如:5×5邻域内20个采样点,有 2 2 0 = 1048576 2^20 =1048576 2201048576种二进制模式。很显然,随着邻域集内采样点数的增加,二进制模式的种类是急剧增加的。

过多的模式种类对于纹理的表达和信息的存取都是不利的。例如,将LBP算子用于纹理分类或人脸识别时,常采用LBP模式的统计直方图来表达图像的信息,而较多的模式种类将使得数据量过大,且直方图过于稀疏。因此,需要对原始的LBP模式进行降维。

Ojala提出了采用一种“等价模式”来对LBP算子的模式种类进行降维,定义为:当某个LBP所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该LBP所对应的二进制就称为一个等价模式类。 如00000000(0次跳变),00000111(只含一次从0到1的跳变),10001111(先由1跳到0,再由0跳到1,共两次跳变)都是等价模式类。
除等价模式类以外的模式都归为另一类,称为混合模式类。

检查某种模式是否是等价模式: 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,则为等价模式。

通过这样的改进,二进制模式的种类大大减少,而不会丢失任何信息。模式数量由原来的 2 P 2^P 2P种减少为 P ∗ ( P − 1 ) + 2 P* (P-1)+2 P(P1)+2种。 l例如对于3×3邻域内8个采样点,二进制模式由原始的256种减少为58(8*7+2)种,这使得特征向量的维数更少,并且可以减少高频噪声带来的影响。

LBP特征进行人脸检测

LBP特征向量提取步骤

1.将检测窗口划分为16×16的小区域,与中心像素值进行比较,得到该窗口中心像素点的LBP值;
2.计算每个区域中数字出现的频率,得到直方图并归一化;
3.将每个区域的直方图连接,得到LBP特征向量。
划分区域的方式不限

代码

#coding:utf-8
import cv2 as cv

# 读取原始图像
img= cv.imread('face.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)

# 绘制矩形和圆形检测人脸
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. 图像算法之七:特征提取算法之LBP.
  2. [ Datawhale ] 计算机视觉下 —— LBP特征描述算子.
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值