Datawhale计算机视觉基础2:LBP特征描述算子-人脸检测

一.LBP简介
LBP指局部二值模式(Local Binary Pattern),是一种用来描述图像局部特征的算子,具有灰度不变性和旋转不变性等显著优点。最初功能为辅助图像局部对比度,LBP常应用于人脸识别和目标检测中。

二.LBP算子原理
由于LBP算子具有灰度不变性和旋转不变性等优点,在数字图像处理和模式识别中,通常用于度量和提取纹理信息,人脸检测也是其中的应用之一。

1.原始LBP算子原理
原始的LBP算子定义在3*3的卷积核中,以卷积核中心点的像素值做为阈值,对周边邻域的八个像素值进行大小比较计算。若邻域的像素值大于或等于中心像素值,则该像素点的位置被标记为1,否则为0;这样就产生了一个8位的二进制数。将8位二进制的数值转化为10进制数值即为当前LBP的值。
在这里插入图片描述
2.传统LBP算子的缺点:
1.卷积核的尺寸被固定了,不利于各种尺度的检测--------改进--------圆形LBP
2.图像进行不同角度旋转时得到的LBP值不同-------改进-------LBP旋转不变模式

细节补充:
(1):在左图中中心像素值等于5,经过判断邻域像素值后得到右图,生成的二进制数按照顺时针方向产生。
(2):进制解释。进制也就是进位计数制,生活中我们常用的是10进制,既逢十进一。对于任何一种进制—X进制,就表示每一位置上的数运算时都是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。

三,圆形LBP算子

为了解决传统LBP算子不能满足不同尺寸和频率纹理的需要,Ojala等对 LBP 算子改进成圆形LBP,将 3×3邻域扩展到任意邻域,并用圆形邻域代替了正方形邻域,改进后的 LBP 算子允许在半径为 R 的圆形邻域内有任意多个像素点。从而得到了诸如半径为R的圆形区域内含有P个采样点的LBP算子。
如图在一个5x5的图像中:
在这里插入图片描述
空心点表示中心点,黑点表示采样点(8个),通过以下公式获取采样点的坐标:
在这里插入图片描述
(Xc,Yc)位中心点,(Xp,Yp)为采样点。

四,LBP旋转不变性
卷积核中特征是灰度不变,但是旋转后计算LBP时获取到的值是容易改变的,同一幅图像,进行旋转以后,其特征将会有很大的差别,这对于特征匹配会造成很大的影响。Ojala在LBP算法上,进行改进,实现了具有旋转不变性的LPB的特征。简单来说其改进方法:就是通过多角度的旋转,统计所有的结果值,将最小的LBP值作为该邻域的值
在这里插入图片描述

如图:当邻域有8个采样点时,就平均旋转8个角度,获取到8个值,将最小的值做为LBP的值。

五,LBP等价模式
一个LBP算子可以产生不同的二进制模式,对于半径为R的圆形区域内含有P个采样点的LBP算子将会产生P的平方种模式,二进制模式的种类过多。
为了解决二进制模式过多的问题,Ojala提出等价模式:当某个LBP所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该LBP所对应的二进制就称为一个等价模式类。
补充:跳变的理解
我们先设定第一组二进制数为000000,第二组为001100,第三组为001101。
第一组到第二组过程中从左往右第三个数由0跳变为1(第一次跳变),接下来在第二组数中第三个数’1’到第四个数’1’认为没有跳变,第四个数’1’到第五个数’0’从1跳变为0(第二次跳变)。所以第一组数到第二组数累计跳变两次。

六,OpenCV的人脸检测实现
1.下载预训练模型lbpcascade_frontalface_improved.xml在opencv-master/data/lbpcascades文件夹中
2.代码:

#coding:utf-8
import cv2

# 读取原始图像
img= cv2.imread('/home/jun/图片/1.jpg')
#face_detect = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

face_detect = cv2.CascadeClassifier("/home/jun/下载/opencv-master/data/lbpcascades/lbpcascade_frontalface_improved.xml")
# 检测人脸
# 灰度处理
gray = cv2.cvtColor(img, code=cv2.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:
    # 绘制矩形人脸区域
    cv2.rectangle(img, pt1 = (x, y), pt2 = (x+w, y+h), color = [0,0,255], thickness=2)
    # 绘制圆形人脸区域 radius表示半径
    cv2.circle(img, center = (x + w//2, y + h//2), radius = w//2, color = [0,255,0], thickness = 2)

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

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

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

检测结果:
在这里插入图片描述
在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐