作者:DayInAI 日期:20190128
此处为人脸检测之后进行人脸质量筛选的方案评估结果,主要是为了筛选不合格人脸,做了基本传统图像处理方法的分类,效果不是很好,后期尝试卷积神经网络做分类。
一、图像的模糊检测
1、基本方案
图像的清晰度检测方法主要分为两种情况:
一种是根据已有的图像,来判断现在的图像是否模糊;
另一种是在无参考图像的情况下,判断图像是否模糊;
现在主要判断无参考图像下的模糊分类。
2、图像预处理
对图片进行预处理操作:检测出人脸区域、设置相同大小的图片、图片灰度化等等。只有这样才不会受到图像大小以及除去人脸以外的因素的影响。
3、基本处理流程
4、实现
(1)Brenner 梯度函数
前后像素的均方误差计算。
def ImageToMatrix(dir,name):
# 读取图片
im = Image.open(dir+name)
# 显示图片
#im.show()
width,height = im.size
im = im.convert("L")
data = im.getdata()
data = np.matrix(data,dtype='float')/255.0
new_data = np.reshape(data,(height,width))
return new_data
def Brenner(img):
x, y = img.shape
D = 0
for i in range(x-2):
for j in range(y-2):
D += (img[i+2, j] - img[i, j])**2
return D
def TestBrener():
dir = "D:/document/ZKBH/bug/face/"
imgList = getAllImg(dir)
for i in range(len(imgList)):
frame = ImageToMatrix(dir , imgList[i])
score = Brenner(frame)
print(str(imgList[i]) + " is " + str(score))
(2)Tenengrad梯度函数
Tenengrad梯度函数采用Sobel算子分别提取水平和垂直方向的梯度。T是给定的边缘检测阈值,Gx和Gy分别是像素点(x,y)处Sobel水平和垂直方向边缘检测算子的卷积。
(3)拉普拉斯边缘检测
拉普拉斯算子为边缘检测的方法,检测出相邻像素之间的差值。
def lapulase(dir,name):
"""
:param dir: 操作目录
:param name: 操作的文件名称
:return: 分数
"""
filePath=dir+name #
img = filePath
# Laplace梯度法
frame = cv2.imread(img)
#cv2.imshow("原始图", frame);
resImg = cv2.resize(frame, (800, 900),interpolation=cv2.INTER_CUBIC)
img2gray = cv2.cvtColor(resImg, cv2.COLOR_BGR2GRAY) # 将图片压缩为单通道的灰度图
#img_resize = cv2.resize(img2gray, (112, 112)) # 为方便与其他图片比较可以将图片resize到同一个大小
res = cv2.Laplacian(img2gray, cv2.CV_64F)
score = res.var()
font = cv2.FONT_HERSHEY_SIMPLEX
fontSize=5
# 照片 添加的文字 /左上角坐标 字体 字体大小 颜色 字体粗细
cv2.putText(resImg, str(score), (0, 200), font, fontSize, (0, 255, 0),6)
newDir=dir+"/_Laplace_/"
if not os.path.exists(newDir):
os.makedirs(newDir)
newName=newDir+name
cv2.imwrite(newName, resImg)
cv2.imshow('image', resImg)
cv2.waitKey(0)
#print("Laplacian score of given image is ", score)
#cv2.imshow(r"gray效果图", img2gray);
#cv2.imshow(r"laplace效果图", resImg);
return score