TheEeeeLin's picture
update files
d5d20be verified
raw
history blame
1.53 kB
"""
@author: cuny
@file: GrindSkin.py
@time: 2022/7/2 14:44
@description:
磨皮算法
"""
import cv2
import numpy as np
def grindSkin(src, grindDegree: int = 3, detailDegree: int = 1, strength: int = 9):
"""
Dest =(Src * (100 - Opacity) + (Src + 2 * GaussBlur(EPFFilter(Src) - Src)) * Opacity) /100
人像磨皮方案,后续会考虑使用一些皮肤区域检测算法来实现仅皮肤区域磨皮,增加算法的精细程度——或者使用人脸关键点
https://www.cnblogs.com/Imageshop/p/4709710.html
Args:
src: 原图
grindDegree: 磨皮程度调节参数
detailDegree: 细节程度调节参数
strength: 融合程度,作为磨皮强度(0 - 10)
Returns:
磨皮后的图像
"""
if strength <= 0:
return src
dst = src.copy()
opacity = min(10., strength) / 10.
dx = grindDegree * 5 # 双边滤波参数之一
fc = grindDegree * 12.5 # 双边滤波参数之一
temp1 = cv2.bilateralFilter(src[:, :, :3], dx, fc, fc)
temp2 = cv2.subtract(temp1, src[:, :, :3])
temp3 = cv2.GaussianBlur(temp2, (2 * detailDegree - 1, 2 * detailDegree - 1), 0)
temp4 = cv2.add(cv2.add(temp3, temp3), src[:, :, :3])
dst[:, :, :3] = cv2.addWeighted(temp4, opacity, src[:, :, :3], 1 - opacity, 0.0)
return dst
if __name__ == "__main__":
input_image = cv2.imread("test_image/7.jpg")
output_image = grindSkin(src=input_image)
cv2.imwrite("grindSkinCompare.png", np.hstack((input_image, output_image)))