基于python人脸光照不均匀数据的制作

基于python人脸光照不均匀数据的制作,第1张

基于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: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实现

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5652226.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存