程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

基於python人臉光照不均勻數據的制作

編輯:Python

文章目錄

  • 一、人臉光照遷移原理
  • 二、python實現人臉光照遷移

近期的主要工作是做人臉光照的質量評估。本來想著使用傳統的基於分塊+方差的形式來做,這種方法有一定的局限性,不能適應所有情況。然後,github找到一些相關項目,使用深度學習的方法實現的。

FIIQA-PyTorch

FIIQA

高高興興,跑起來,發現完全不行啊。下載的數據只有3類,結合github上200類,這個有點差距。

所以想著自己制作,參考論文如下:

Face Illumination Transfer through Edge-preserving Filters

一、人臉光照遷移原理

論文中主要將人臉分為3部分:顏色層、大尺度層以及細節層。將人臉圖像轉化到Lab顏色空間,其中L通道表示亮度值;a、b表示顏色層。對L通道通過wsl(加權最小二濾波)濾波可以得到大尺度層,然後通過如下:
d e t a i l s = L l a r g e s c a l e details=\frac{L}{largescale} details=largescaleL​
其中:largscale表示大尺度層,details表示細節層。

通過上述方法,依次對模板和目標圖像提取大尺度層,然後,這兩個圖像進行引導濾波/導向濾波(Guided Filter)。注意,這裡將目標作為引導圖,模板作為初始圖像,使得模板與目標相似。

通過,導向濾波之後,需要還原亮度通道L,參考上述公式進行計算,然後將Lab空間轉化為BGR空間,最終得到人臉光照不均勻的遷移圖片。

二、python實現人臉光照遷移

import cv2
from cv2.ximgproc import *
import numpy as np
def lightness_layer_decomposition(img,conf,sigma):
''' 將圖片分離為顏色層和亮度層 :param img: :return: '''
# wsl濾波
large_scale_img=fastGlobalSmootherFilter(img, img, conf, sigma)
detail_img=img/large_scale_img
return large_scale_img,detail_img
def face_illumination_transfer(target=None, reference=None):
''' 將標簽光照遷移到目標人臉上 :param target: :param reference: :return: '''
h,w=reference.shape[:2]
target=cv2.resize(target,(w,h))
# lab顏色轉換
# 提取顏色(a,b)和亮度層l
lab_img = cv2.cvtColor(target, cv2.COLOR_BGR2Lab)
l, a, b = cv2.split(lab_img)
lab_rimg = cv2.cvtColor(reference, cv2.COLOR_BGR2Lab)
lr, ar,br = cv2.split(lab_rimg)
# 將亮度層進行分層:大尺度層和細節層
large_scale_img, detail_img= lightness_layer_decomposition(l,600,20)
large_scale_rimg, detail_rimg = lightness_layer_decomposition(lr,600,20)
# 通過引導波濾波將模板亮度遷移到目標圖上
large_scale_rimg = large_scale_rimg.astype('float32')
large_scale_img = large_scale_img.astype('float32')
out=guidedFilter(large_scale_img,large_scale_rimg,18,1e-3)
out=out*detail_img
out=out.astype(np.uint8)
res=cv2.merge((out,a,b))
res=cv2.cvtColor(res,cv2.COLOR_Lab2BGR)
return res
if __name__=="__main__":
img_file=r"D:\data\face\good3\1630905386503.jpeg"
reference=r"D:\data\face_illumination\illumination patterns\office-lamp-night-6.JPG"
# 讀取人臉圖片
img = cv2.imread(img_file)
rimg=cv2.imread(reference)
res=face_illumination_transfer(img,rimg)
cv2.imshow("res",res)
cv2.waitKey(0)

最終結果如下:

參考連接:

opencv使用 — fastGlobalSmootherFilter

引導圖濾波(Guided Image Filtering)原理以及OpenCV實現


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved