人像美白在现在的美颜功能里面几乎属于必备的,各家的方案都不太一致,本文主要介绍一种基于肤色分割的人像美白方案。 首先得将人像进行皮肤分割,具体最好是使用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)
效果图如下:
我们可以看到,上图的美白效果还是很自然,而且逻辑也非常简单