python实现人像美颜

在这里插入图片描述
在这里插入图片描述

python实现人像美颜(20190221)

文章目录:


虽然现在各种美颜APP烂大街,效果也非常好,但是想要自己用代码实现同样的效果还是有难度的,因为商用的效果大家算法和代码几乎都是不开源的


一、美颜思路介绍

美颜大致上可以分为两块:美白磨皮
如果玩过Photoshop的都知道其实美颜其实就是四大步:

  1. 用具有保边效果的滤波算法对图像进行模糊处理。
  2. 用肤色检测算法保护非皮肤区域。
  3. 将模糊后的图像和原图进行图像融合。
  4. 对融合后的图像进行锐化处理。

对于步骤1,滤波算法可以选择双边滤波,导向滤波,表面模糊等,只要能保边缘就行,有人说高斯模糊是不行的,但事实上只做美白是可以的,高斯模糊没办法实现磨皮效果。如果单单使用高斯模糊来磨皮,得到的效果是不尽人意的。原因在于,高斯模糊只考虑了像素间的距离关系,没有考虑到像素值本身之间的差异。举个例子来讲,头发与人脸分界处(颜色差异很大,黑色与人皮肤的颜色),如果采用高斯模糊则这个边缘也会模糊掉,这显然不是我们希望看到的。而双边滤波(Bilateral Filter) 则考虑到了颜色的差异,它的像素点取值也是周边像素点的加权平均,而且权重也是高斯函数。不同的是,这个权重不仅与像素间距离有关,还与像素值本身的差异有关,具体讲是,像素值差异越小,权重越大,也是这个特性让它具有了保持边缘的特性,因此它是一个很好的磨皮工具

二、美颜算法实现


Reference:
1、https://www.jianshu.com/p/905b05ee1f22
2、https://cloud.tencent.com/developer/article/1094472
3、https://blog.csdn.net/Trent1985/article/details/83145851 # 人像审美介绍

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠

基于人像分割的局部美颜通常指的是对人脸区域进行美颜处理,同时保留原始图像的背景。实现方式可以使用人像分割技术来分离人脸和背景,然后对人脸区域进行美颜处理。 以下是一种基于GrabCut算法实现方法: 1. 加载图像并将其转换为灰度图像。 ```python import cv2 img = cv2.imread('your_image.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ``` 2. 使用OpenCV的Haar级联分类器来检测人脸。 ```python face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') faces = face_cascade.detectMultiScale(gray, 1.3, 5) ``` 3. 对于每个检测到的人脸区域,使用GrabCut算法进行人像分割。 ```python # 创建一个掩码(mask),将人脸区域初始化为前景(前景=1,背景=0) mask = np.zeros(img.shape[:2], np.uint8) for (x,y,w,h) in faces: rect = (x, y, w, h) mask, bgdModel, fgdModel = cv2.grabCut(img, mask, rect, None, None, 5, cv2.GC_INIT_WITH_RECT) # 将掩码中标记为前景的区域提取出来作为人像 person = cv2.bitwise_and(img, img, mask=(mask==cv2.GC_FGD).astype(np.uint8)) ``` 4. 对人像区域应用美颜效果。 ```python # 对人像区域应用美颜效果 person = cv2.GaussianBlur(person, (15, 15), 0) # 高斯模糊 person = cv2.addWeighted(person, 1.5, person, 0, 10) # 图像增强 ``` 5. 将美化后的人像区域和原始图像的背景合并。 ```python # 将美化后的人像区域和原始图像的背景合并 background = cv2.bitwise_and(img, img, mask=(mask==cv2.GC_BGD).astype(np.uint8)) result = cv2.bitwise_or(person, background) ``` 最后,使用`cv2.imshow`函数将处理后的图像显示出来。 ```python cv2.imshow('image', result) cv2.waitKey(0) cv2.destroyAllWindows() ``` 需要注意的是,GrabCut算法需要人工指定一个矩形框来包含人脸区域,如果矩形框不准确,会影响分割的效果。另外,GrabCut算法的计算量比较大,处理较大的图像可能会比较耗时。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值