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

python代码如下:

import cv2import numpy as npdef skin_whiten(img, skin_mask, whitening_degree=1.0):kernel_size = 30dilate_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.0skin_mask = cv2.resize(skin_mask, (img.shape[1], img.shape[0]))skin_mask[:, :, 0] *= 0.75skin_mask[:, :, 1] *= 0.75whiten_mask = skin_mask * 0.2 * whitening_degree + 0.5img = img / 255.0output_pred = (-2 * whiten_mask + 1) * img * img + 2 * whiten_mask * imgoutput_pred = output_pred * 255.0return output_predimg = 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)

效果图如下:

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