要求

请选取一幅人脸图片,在保证头发丝和背景等区域的清晰度的同时,对面部皮肤做美颜处理。
要求:
写清楚具体算法流程
图像原图与结果图(如有中间步骤图,也请提交)
关键代码

算法选择

方案一人脸检测+部位美颜

300行Python实现基于人脸特征的美颜算法
为了学习该历程创建了虚拟环境conda activate pymeiyan
发现py3.6版本报错python setup.py egg_info解决
pip install 与 conda install 的使用区别conda install 安装的库都会放在anaconda3/pkgs目录下。这样的好处就是,当在某个环境下已经下载好了某个库,再在另一个环境中还需要这个库时,就可以直接从pkgs目录下将该库复制至新环境而不用重复下载,建议在conda虚拟环境中使用conda install太卡
运行dlib中的示例文件,遇到报错
RuntimeError: Unexpected version found while deserializing dlib::shape_predictor.
原因:.bz2文件直接修改文件名为.dat报这个错
解决办法:.bz2文件解压得到.dat文件,执行.py文件执行正常。
目前只是把程序复现了,还需再加个自定义函数以降低HSV的红色通道就行了。参考1效果不好
该程序已经复现,但是有些类中的方法没完全看懂【231213】

2局部祛痘和磨皮算法

ndarray中符合条件的元素进行处理---numpy中的where函数
双边滤波可行示例,双边滤波的介绍

基于降低红色通道阈值灰度和双边滤波美化人像

算法流程

本文使用的原始图片如图1所示,该图片在额头部分有较多痘痘。由于痘痘偏红色,因此本文先对图片的红色通道高于255*0.6低于255的灰度值进行呈比例降低,目的是淡化痘痘颜色;然后,本文使用双边滤波,具体使用OpenCV中的双边滤波函数cv2.bilateralFilter(),双边滤波会综合考虑距离和色彩的权重结果,既能够有效地去除噪声,又能够较好地保护边缘信息避免对原图的非脸面信息造成失真。再使用cv2.addWeighted权重加法函数,来对输入图像和前两步处理后的图像进行融合各自的权重分别为alpha和beta,以防止双边滤波后丢失太多细节;最后,进行图像锐化和对比度这些细节调节以便优化输出处理后的图像。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import cv2
import numpy as np
import PIL
from PIL import ImageEnhance
from PIL import Image


# 人脸磨皮
def facial_meihua_effect(filepath,output_name):
#祛痘
# 读取图像默认BGR空间
image = cv2.imread(filepath)
# 转换颜色空间为BGR
image_bgr = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
a = image_bgr[:, :, 2]
# 减少红色通道的灰度
print(a, type(a), print('ndarray的形状: ', a.shape))
xsl, ysl = a.shape
for i in range(xsl):
for j in range(ysl):
if a[i, j] >= 255 * 0.8 and a[i, j] < 250:
a[i, j] = a[i, j]*0.95
print(a, type(a), print('ndarray的形状: ', a.shape))
# 将图像转换回RGB颜色空间
image_qvdou = cv2.cvtColor(image_bgr, cv2.COLOR_RGB2BGR)
# 对原始使用双边滤波
blur_img = cv2.bilateralFilter(image_qvdou, 100, 90,90)
# 滤波后与原始图像融合
result_img = cv2.addWeighted(image_qvdou, 0.3, blur_img, 0.7, 0)
cv2.imwrite(f"{output_name}_1.jpg", result_img)
image = Image.open(f"{output_name}_1.jpg")
# 锐度调节
enh_img = ImageEnhance.Sharpness(image)
image_sharped = enh_img.enhance(1.5)
# 对比度调节
con_img = ImageEnhance.Contrast(image_sharped)
image_con = con_img.enhance(1.15)
image_con.save(f"{output_name}.jpg")
# 美白
img1 = cv2.imread(filepath)
img2 = cv2.imread(f"{output_name}.jpg")
cv2.imshow("original", img1)
cv2.imshow("meihua", img2)
cv2.waitKey()
cv2.destroyAllWindows()


if __name__ == "__main__":
input_path = './img/ys.jpg'
output_name='meihuahou'
facial_meihua_effect(input_path,output_name)