LBP算子简介
LBP指局部二值模式(Local Binary Pattemn),是一种 用来描述图像局部特征的算子,具有灰度不变性和旋转不变
性等显著优点。LBP常应用于人脸识别和目标检测中,在OpenCV中有使用LBP特征进行人脸识别的接口,也有用
LBP特征训练目标检测分类器的方法,OpenCV实现了LBP特征的计算,但没有提供-一个单独的计算LBP特征的接
口。也就是说OpenCV中使用了LBP算法,但是没有提供函数接口。在这个深度学习发展非常迅猛的时代仍然具有借鉴意义。
LBP算子原理
- 这里可能用到概率论和数理统计的知识,先是
- 其中(t(gc))决定了局部区域的整体亮度,对于纹理特征,可以忽略这一项,最终得到:
LBP的三个发展阶段
3X3矩阵的像素
圆形LBP算子
- 为了适应不同尺度的纹理特征,并达到灰度级和旋转不变性的要求,
- 3x3邻域扩展到任意邻域,并用圆形邻域代替了正方形邻域,
LBP的旋转不变性
说实话,没看太懂,先fork一下 qwq
LBP的等价模式
定义:当某个局部二进制模式所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该局部二进制模式所对应的二进制就称为-一个等价模式。
人脸检测的流程
运用滑动窗口的方法
代码实战
插值算法
import cv2
import matplotlib.pyplot as plt
# %matplotlib inline
if __name__ == "__main__":
img = cv2.imread('gangshou.png', cv2.IMREAD_UNCHANGED)
print('Original Dimensions : ',img.shape)
scale_percent = 30 # percent of original size
width = int(img.shape[1] * scale_percent / 100)
height = int(img.shape[0] * scale_percent / 100)
dim = (width, height)
# resize image
resized = cv2.resize(img, dim, interpolation = cv2.INTER_LINEAR)
fx = 1.5
fy = 1.5
resized1 = cv2.resize(resized, dsize=None, fx=fx, fy=fy, interpolation = cv2.INTER_NEAREST)
resized2 = cv2.resize(resized, dsize=None, fx=fx, fy=fy, interpolation = cv2.INTER_LINEAR)
print('Resized Dimensions : ',resized.shape)
plt.imshow(resized)
plt.show()
plt.imshow(resized1)
plt.show()
plt.imshow(resized2)
plt.show()
# cv2.imshow("Resized image", resized)
# cv2.imshow("INTER_NEAREST image", resized1)
# cv2.imshow("INTER_LINEAR image", resized2)
cv2.waitKey(0)
LBP算法
import cv2 as cv
import numpy
# from PIL import Image
import matplotlib.pyplot as plt
#读取图像
img=cv.imread('lena.png')
# 检测人脸
face_detect =cv.CascadeClassifier('lbpcascade_frontalface_improved.xml')
# face_detect =cv.CascadeClassifier('haarcascade_frontalface_alt.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+h,w+h),color=[0,255,255],thickness=2)
# 绘制圆形人脸的区域,radius表示半径
cv.circle(img,center=(x+w//2,y+h//2),radius=w//2,color=[0,255,0],thickness=2)
# display(Image.open(img))
plt.imshow(img)
plt.show()
参考论文
[1] Multiresolution gray-scale and rotation invariant texture classification with local binary patterns