""" @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)))