OpenCV 磨皮-Python

背景

朋友給了個(gè)證件磨皮的需求。研究了實(shí)現(xiàn)方式,記錄一下。

實(shí)現(xiàn)原理

大神提供的算法:
Dest =(Src * (100 - Opacity) + (Src + 2 * GuassBlur(EPFFilter(Src) - Src + 128) - 256) * Opacity) /100 ;
大神本神傳送門(mén),該算法其實(shí)是對(duì) PS 的一種磨皮方案的腳本實(shí)現(xiàn)。

Python + OpenCV 實(shí)現(xiàn)

網(wǎng)上看到的一個(gè)基于上述公式的 python 實(shí)現(xiàn)方案beauty_face,但是他再線性光疊加時(shí)出錯(cuò),修正后如beauty_face2(由于對(duì)Python矩陣運(yùn)算不熟悉使用了比較笨的方法實(shí)現(xiàn)), 具體見(jiàn)代碼:

#!/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; 磨皮程度與細(xì)節(jié)程度的確定
    v1 = 3
    v2 = 1
    dx = v1 * 5 # 雙邊濾波參數(shù)之一 
    fc = v1 * 12.5 # 雙邊濾波參數(shù)之一 
    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; 磨皮程度與細(xì)節(jié)程度的確定
    v1 = 3
    v2 = 1
    dx = v1 * 5 # 雙邊濾波參數(shù)之一 
    fc = v1 * 12.5 # 雙邊濾波參數(shù)之一 
    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()

實(shí)驗(yàn)效果圖

原圖(只用于算法實(shí)驗(yàn)侵權(quán)聯(lián)系作者刪除)、beauty_facebeauty_face2 對(duì)比如下:

原圖

beauty_face
beauty_face2

總結(jié)

直接使用 PS 雙曲線、中性灰、高低頻等磨皮方案,能比自動(dòng)化處理取得不錯(cuò)的效果,但自動(dòng)化勝在傻瓜化。目前的方案是對(duì)全圖做了平滑處理,并不只是對(duì)臉部,更高級(jí)方案可參考圖像算法---磨皮算法研究匯總。

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個(gè) Awesome - XXX 系列...
    小邁克閱讀 3,123評(píng)論 1 3
  • Web UI測(cè)試自動(dòng)化 splinter - web UI測(cè)試工具,基于selnium封裝。 selenium -...
    Thea0216閱讀 6,461評(píng)論 2 48
  • 先前總崇拜所謂民國(guó)四大情書(shū),現(xiàn)在看來(lái),沈從文是深情無(wú)措的稚子,魯迅是溫情別扭的硬漢,朱湘是溫柔委屈的弱書(shū)生,徐志摩...
    將仲子閱讀 386評(píng)論 1 3
  • 1.全球化語(yǔ)言支持,根據(jù)系統(tǒng)設(shè)置的語(yǔ)言選擇字符串語(yǔ)言。 iOS 多語(yǔ)言支持 之后再用一個(gè)單例類(lèi)來(lái)提供字串,如: 不...
    the宇亮閱讀 666評(píng)論 0 1
  • 你在 我陪 你不離我不棄
    月花陰閱讀 324評(píng)論 0 0

友情鏈接更多精彩內(nèi)容