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