如何更改人体图像的肤色?

Nav*_*Nav -3 python opencv python-imaging-library

我有一张显示皮肤的人体图像。假设我有另一种肤色并且假设我在身体图像中有一个暴露皮肤的面具,我该如何改变皮肤的颜色?

fmw*_*w42 5

这是在 Python/OpenCV 中执行此操作的一种方法。我不确定它有多健壮。

基本上,我们得到了人脸的平均颜色。获取该颜色与所需颜色之间的差异颜色(在每个通道中)。然后我们将差异添加到输入图像中。然后我们使用蒙版来组合原始图像和新图像。

输入:

在此处输入图片说明

口罩:

在此处输入图片说明

import cv2
import numpy as np
import skimage.exposure

# specify desired bgr color for new face and make into array
desired_color = (180, 128, 200)
desired_color = np.asarray(desired_color, dtype=np.float64)

# create swatch
swatch = np.full((200,200,3), desired_color, dtype=np.uint8)

# read image
img = cv2.imread("zelda1.jpg")

# read face mask as grayscale and threshold to binary
facemask = cv2.imread("zelda1_facemask.png", cv2.IMREAD_GRAYSCALE)
facemask = cv2.threshold(facemask, 128, 255, cv2.THRESH_BINARY)[1]

# get average bgr color of face
ave_color = cv2.mean(img, mask=facemask)[:3]
print(ave_color)

# compute difference colors and make into an image the same size as input
diff_color = desired_color - ave_color
diff_color = np.full_like(img, diff_color, dtype=np.uint8)

# shift input image color
# cv2.add clips automatically
new_img = cv2.add(img, diff_color)

# antialias mask, convert to float in range 0 to 1 and make 3-channels
facemask = cv2.GaussianBlur(facemask, (0,0), sigmaX=3, sigmaY=3, borderType = cv2.BORDER_DEFAULT)
facemask = skimage.exposure.rescale_intensity(facemask, in_range=(100,150), out_range=(0,1)).astype(np.float32)
facemask = cv2.merge([facemask,facemask,facemask])

# combine img and new_img using mask
result = (img * (1 - facemask) + new_img * facemask)
result = result.clip(0,255).astype(np.uint8)

# save result
cv2.imwrite('zelda1_swatch.png', swatch)
cv2.imwrite('zelda1_recolor.png', result)

cv2.imshow('swatch', swatch)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

所需色样:

在此处输入图片说明

结果:

在此处输入图片说明