人像美白的python实现

人像美白在现在的美颜功能里面几乎属于必备的,各家的方案都不太一致,本文主要介绍一种基于肤色分割的人像美白方案。
首先得将人像进行皮肤分割,具体最好是使用AI模型,这里就不展开了,本人侧重点是美白算法,所以这里直接使用了一张皮肤分割好的mask图。
mask图的效果如下图所示,白色区域为皮肤区域,黑色区域为非皮肤区域。

 python代码如下:

import cv2
import numpy as np


def skin_whiten(img, skin_mask, whitening_degree=1.0):
    kernel_size = 30
    dilate_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (kernel_size, kernel_size))
    erode_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (kernel_size, kernel_size))
    skin_mask = cv2.dilate(skin_mask, dilate_kernel, 1)
    skin_mask = cv2.erode(skin_mask, erode_kernel, 1)
    skin_mask = cv2.blur(skin_mask, (20, 20)) / 255.0
    skin_mask = cv2.resize(skin_mask, (img.shape[1], img.shape[0]))
    skin_mask[:, :, 0] *= 0.75
    skin_mask[:, :, 1] *= 0.75
    whiten_mask = skin_mask * 0.2 * whitening_degree + 0.5
    img = img / 255.0
    output_pred = (-2 * whiten_mask + 1) * img * img + 2 * whiten_mask * img
    output_pred = output_pred * 255.0
    return output_pred


img = cv2.imread("tmp/17.png")
mask = cv2.imread("tmp/17_mask.jpg")
res_img = skin_whiten(img=img, skin_mask=mask, whitening_degree=2.0)
cv2.imwrite("tmp/17_whiten.jpg", res_img)

效果图如下:

我们可以看到,上图的美白效果还是很自然,而且逻辑也非常简单

猜你喜欢

转载自blog.csdn.net/zhou_438/article/details/131443565