OpenCV 磨皮-Python

背景

朋友给了个证件磨皮的需求。研究了实现方式,记录一下。

实现原理

大神提供的算法:
Dest =(Src * (100 - Opacity) + (Src + 2 * GuassBlur(EPFFilter(Src) - Src + 128) - 256) * Opacity) /100 ;
大神本神传送门,该算法其实是对 PS 的一种磨皮方案的脚本实现。

Python + OpenCV 实现

网上看到的一个基于上述公式的 python 实现方案beauty_face,但是他再线性光叠加时出错,修正后如beauty_face2(由于对Python矩阵运算不熟悉使用了比较笨的方法实现), 具体见代码:

#!/bin/python
# 祛痘美白 

import numpy as np
import cv2

def beauty_face(img):
    '''
    Dest =(Src * (100 - Opacity) + (Src + 2 * GuassBlur(EPFFilter(Src) - Src + 128) - 256) * Opacity) /100 ;
    https://my.oschina.net/wujux/blog/1563461
    '''

    dst = np.zeros_like(img)
    #int value1 = 3, value2 = 1; 磨皮程度与细节程度的确定
    v1 = 3
    v2 = 1
    dx = v1 * 5 # 双边滤波参数之一 
    fc = v1 * 12.5 # 双边滤波参数之一 
    p = 0.1
   
    temp4 = np.zeros_like(img)
    
    temp1 = cv2.bilateralFilter(img,dx,fc,fc)
    temp2 = cv2.subtract(temp1,img)
    temp2 = cv2.add(temp2,(10,10,10,128))
    temp3 = cv2.GaussianBlur(temp2,(2*v2 - 1,2*v2-1),0)
    temp4 = cv2.add(img,temp3)
    dst = cv2.addWeighted(img,p,temp4,1-p,0.0)
    dst = cv2.add(dst,(10, 10, 10,255))
    return dst

def beauty_face2(src):
    '''
    Dest =(Src * (100 - Opacity) + (Src + 2 * GuassBlur(EPFFilter(Src) - Src + 128) - 256) * Opacity) /100 ;
    '''

    dst = np.zeros_like(src)
    #int value1 = 3, value2 = 1; 磨皮程度与细节程度的确定
    v1 = 3
    v2 = 1
    dx = v1 * 5 # 双边滤波参数之一 
    fc = v1 * 12.5 # 双边滤波参数之一 
    p = 0.1
   
    temp4 = np.zeros_like(src)
    
    temp1 = cv2.bilateralFilter(src,dx,fc,fc)
    temp2 = cv2.subtract(temp1,src)
    temp2 = cv2.add(temp2, (10,10,10,128))
    temp3 = cv2.GaussianBlur(temp2,(2*v2 - 1,2*v2-1),0)
    temp4 = cv2.subtract(cv2.add(cv2.add(temp3, temp3), src), (10, 10, 10, 255))
    
    dst = cv2.addWeighted(src,p,temp4,1-p,0.0)
    dst = cv2.add(dst, (10, 10, 10,255))
    return dst


def init():
    img = cv2.imread('testimg.jpg')

    # blur1 = cv2.GaussianBlur(img, (5,5),0)
    # blur2 = cv2.bilateralFilter(img, 9 , 75, 75)
    blur3 = beauty_face(img)
    blur4 = beauty_face2(img)

    cv2.imshow('image0', img)
    # cv2.imshow('image1', blur1)
    # cv2.imshow('image2', blur2)
    cv2.imshow('image3', blur3)
    cv2.imshow('image4', blur4)

    #cv2.namedWindow('image', cv2.WINDOW_NORMAL)
    #cv2.resizeWindow('image', 1000, 1000) #定义frame的大小

    cv2.waitKey(0)
    cv2.imwrite('result1.png', blur3)
    cv2.imwrite('result2.png', blur4)
    cv2.destroyAllWindows()

if __name__ == "__main__":
    init()

实验效果图

原图(只用于算法实验侵权联系作者删除)、beauty_facebeauty_face2 对比如下:

原图

beauty_face
beauty_face2

总结

直接使用 PS 双曲线、中性灰、高低频等磨皮方案,能比自动化处理取得不错的效果,但自动化胜在傻瓜化。目前的方案是对全图做了平滑处理,并不只是对脸部,更高级方案可参考图像算法---磨皮算法研究汇总

参考

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 8,134评论 1 3
  • Web UI测试自动化 splinter - web UI测试工具,基于selnium封装。 selenium -...
    Thea0216阅读 11,363评论 2 48
  • 先前总崇拜所谓民国四大情书,现在看来,沈从文是深情无措的稚子,鲁迅是温情别扭的硬汉,朱湘是温柔委屈的弱书生,徐志摩...
    将仲子阅读 2,732评论 1 3
  • 1.全球化语言支持,根据系统设置的语言选择字符串语言。 iOS 多语言支持 之后再用一个单例类来提供字串,如: 不...
    the宇亮阅读 3,707评论 0 1
  • 你在 我陪 你不离我不弃
    月花阴阅读 2,206评论 0 0