学习日记_LBP特征描述算子-人脸检测

算法理论介绍

LBP原理介绍

  LBP特征用图像的局部领域的联合分布\(T\)来描述图像的纹理特征,如果假设局部邻域中像素个数为\(P(P>1)\),那么纹理特征的联合分布\(T\)可以表述成:

\(T=t(g_c,g_0,…,g_{p−1});p=0,…,P−1\)

其中,\(g_c\)表示相应局部邻域的中心像素的灰度值,\(g_p\)表示以中心像素圆心,以\(R\)为半径的圆上的像素的灰度值。

  假设中心像素和局部邻域像素相互独立,那么这里可以将上面定义式写成如下形式:

\[\begin{aligned}T&=t(g_c,g_0−g_c,…,g_{p−1}−g_c)\\&≈t(g_c)t(g_0−g_c,…,g_{p−1}−g_c);p=0,…,P−1\end{aligned} \]

其中\(t(g_c)\)决定了局部区域的整体亮度,对于纹理特征,可以忽略这一项,最终得到:

\(T≈t(g_0−g_c,…,g_{p−1}−g_c);p=0,…,P−1\)

上式说明,将纹理特征定义为邻域像素和中心像素的差的联合分布函数,因为gp−gc是基本不受亮度均值影响的,所以从上式可以看出,此时统计量T 是一个跟亮度均值,即灰度级无关的值。
最后定义特征函数如下:

\(T≈t(s(g_0−g_c),…,s(g_{p−1}−g_c));p=0,…,P−1\)

扫描二维码关注公众号,回复: 11358051 查看本文章
\[s(x)=\begin{cases}1, & x \geq0\\0, & x<0\end{cases} \]

定义灰度级不变LBP为:

\(LBP_{P,R}=\sum\limits_{p=0}^{P−1}s(g_p−g_c)2^p\)

即二进制编码公式。

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

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

图1.1.1LBP计算示意图

圆形LBP算子

  基本的LBP算子的最大缺陷在于它只覆盖了一个固定半径范围内的小区域,这显然不能满足不同尺寸和频率纹理的需要。为了适应不同尺度的纹理特征,并达到灰度级和旋转不变性的要求,Ojala等对LBP算子进行了改进,将\(3×3\)邻域扩展到任意邻域,并用圆形邻域代替了正方形邻域,改进后的 LBP算子允许在半径为\(R\)的圆形邻域内有任意多个像素点。从而得到了诸如半径为R的圆形区域内含有\(P\)个采样点的LBP算子,表示为\(LBP^R_P\)

图1.2.2圆形LBP示意图

  对于给定中心点\((x_c,y_c)\),\(p\in{P}\)其采样点\((x_p,y_p)\)用如下公式计算:

\(x_p=x_c+Rcos(\frac{2{\pi}p}{P})\)
\(y_p=y_c+Rsin(\frac{2{\pi}p}{P})\)

\(R\)是采样半径,\(p\)是第\(p\)个采样点,\(P\)是采样数目。如果近邻点不在整数位置上,就需要进行插值运算。

LBP旋转不变性及等价模式

  LPB特征是灰度不变,但不是旋转不变的,同一幅图像,进行旋转以后,其特征将会有很大的差别,影响匹配的精度。Ojala在LBP算法上,进行改进,实现了具有旋转不变性的LPB的特征。

实现方法:不断旋转圆形邻域得到一系列初始定义的LPB值,取最小值作为该邻域的值。

\(LBP^{ri}_{PR}=min(ROR(LBP^{ri}_{P,R},i)|i=0,1,…,P−1)\)

其中\(LBP^{ri}_{PR}\)表示具有旋转不变性的LBP特征。\(ROR(x,i)\)为旋转函数,表示将\(x\)右循环\(i\)位。

图1.3.3求取旋转不变的LPB特征示意图

等价模式:
  一个LBP算子可以产生不同的二进制模式,对于LBPRp将会产生2p种模式。比如7∗7邻域内有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)∣+\sum\limits_{p=1}^{P−1}|s(g_p−g_c)−s(g_{P−1}−g_c)|\)

将其和其移动一位后的二进制模式按位相减。并绝对值求和。若\(U(G_p)\)小于等于2,则为等价模式。

混合模式:
  除了等价模式之外的称为混合模式。

  改进后的LPB模式数由2^{p}(p为邻域集内的采集点数)降维为p∗(p−1)+2。维数减少,可以降低高频噪声的影响。Ojala认为等价模式占总模式中的绝大多数。图1.3.4(a), (b), (c)等价模式分别占88%,93%和76%。

图1.3.4

人脸检测流程

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

图1.3.5人脸检测流程图

基于OpenCV的实现

  • 使用OpenCV的LBP于预训练模型
  • 将haarcascade_frontalface_default.xml下载至本地以方便调用,下载链接:下载链接
#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)

# 绘制矩形和圆形检测人脸
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()

本文博客转载自LBP特征描述算子-人脸检测

猜你喜欢

转载自www.cnblogs.com/hehuaizhou/p/13187704.html