背景
朋友給了個(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_face 與 beauty_face2 對(duì)比如下:

原圖

beauty_face

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