要求
请选取一幅人脸图片,在保证头发丝和背景等区域的清晰度的同时,对面部皮肤做美颜处理。
要求:
写清楚具体算法流程
图像原图与结果图(如有中间步骤图,也请提交)
关键代码
算法选择
方案一人脸检测+部位美颜
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,以防止双边滤波后丢失太多细节;最后,进行图像锐化和对比度这些细节调节以便优化输出处理后的图像。
代码
| 12
 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 cv2import numpy as np
 import PIL
 from PIL import ImageEnhance
 from PIL import Image
 
 
 
 def facial_meihua_effect(filepath,output_name):
 
 
 image = cv2.imread(filepath)
 
 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))
 
 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)
 
 |