- 一、人脸光照迁移原理
- 二、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:datafacegood31630905386503.jpeg" reference=r"D:dataface_illuminationillumination patternsoffice-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实现
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)