Underexposed Photo Enhancement using Deep Illumination Estimation(DeepUPE)笔记

本文介绍了一种名为DeepUPE的图像增强技术,它利用深度照明估计来提升曝光不足图像的质量。不同于传统方法,DeepUPE通过学习照明映射,能更精确地重建图像的光照细节。其网络结构包括预训练的VGG16编码器,用于特征提取,并结合重建、平滑和颜色损失进行训练。

文章:Underexposed Photo Enhancement using Deep Illumination Estimation (DeepUPE) (CVPR2019)

github: https://github.com/wangruixing/DeepUPE

Loss: Reconstruction Loss + Smoothness Loss + Color Loss

摘要:该文章的任务是对曝光不足的图像进行增强。与之前的图像增强方法(直接学习图像到图像的映射)不同,DeepUPE学习(曝光不足图像)\emph{I}与(illumination map)\emph{S}的映射,这样可以更好地学习Grund Truth的复杂光照。DeepUPE根据光照先验建立Loss函数。

图像增强:图像增强任务可以看作寻找\emph{I}与增强图像\tilde{I}的映射关系\mathcal{F},增强图像可以表示为\tilde{I}=\mathcal{F}(I),在Retinex图像增强方法中,\mathcal{F}的逆过程被建模为(illumination map)\emph{S}。存在关系\emph{I}=\emph{S}*\tilde{I},其中符号*表示基于像素的乘法,当已知\emph{S}时,增强图像便可以求得\mathcal{F}(I)=\emph{S}^{-1}*{I}。DeepUPE的任务就是通过网络学习\emph{I}\emph{S}的映射关系。

网络结构:

首先,将\emph{I}下采样后送入Encoder(采用VGG16的pre-trained模型),得到feature map;然后提取feature map的局部和全局features,将得到的features通过卷积层组合成低分辨率illumination;然后上采样得到\emph{S};最后结合\emph{I}得到最终的增强图像\tilde{I}。训练网络时使用Reconstruction Loss (L_r)、Smoothness Loss (L_s)、 Color Loss (L_c)。

       L_r:重构loss定义为重构的增强图像\mathcal{F}(I)与Ground Truth \tilde{I} 的L2误差,参考

       L_s:根据平滑先验,自然图像的光照通常是局部平滑的。在DeepUPE中引入平滑先验有两方面的优点:首先,可以防止过拟合,增加网络的泛化能力;其次,可以增强图像的对比度。

       L_c:将重构的增强图像\mathcal{F}(I) 的每个RGB像素看作三维向量(\mathcal{F}(I))_p,同样Ground Truth \tilde{I}对应的向量为(\tilde{I})_p,他们之间的角度为\angle{((\mathcal{F}(I))_p,(\tilde{I})_p)}。其中()_p表示一个像素,\angle(,)表示计算两个向量夹角的一种方法。颜色loss可以通过在颜色空间中计算像素的L2距离,之所以不采用这种简单的方法,是因为:一、重构loss已经使用L2计算了像素误差;二、L2进行数值度量,不能保证颜色向量的方向一致性,可能导致颜色的不匹配。

通过Figure.4可以对比不同loss的效果(作用):

实验:作者只提供了测试代码,如果想用自己的数据训练需要自己写训练代码。下图为使用自己的数据训练与测试的结果:

其中,Input表示输入图像,DeepUPE Pre-train Model表示源代码模型结果,Ours为我们的训练测试结果。

### 高质量欠曝照片修复代码 为了实现高质量的欠曝照片修复,一种有效的方法是基于深度学习模型估计光照分量并进行图像增强。这种方法能够有效地提升低光环境下的图片质量,同时减少噪声和其他伪影。 下面是一个简单的Python代码示例,该代码实现了基于Retinex理论的照片增强算法: ```python import cv2 import numpy as np def retinex_adjust(image, alpha=128): """ 使用Retinex方法调整图像亮度 参数: image (numpy.ndarray): 输入RGB图像. alpha (float): 控制反射率强度,默认值为128. 返回: numpy.ndarray: 处理后的图像. """ img_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 计算log(I)=log(S)+log(R),其中I表示原始灰度图 log_i = np.log(img_gray + 1e-6) # 创建高斯核用于平滑处理得到S(x,y) gaussian_kernel = cv2.getGaussianKernel(ksize=7, sigma=-1) s_xy = cv2.filter2D(log_i, ddepth=cv2.CV_32F, kernel=gaussian_kernel) r_xy = log_i - s_xy # 对数域中的反射成分转换回线性空间 reflectance = np.exp(r_xy).clip(min=0., max=None) # 调整反射层以适应视觉感知特性 adjusted_reflectance = ((reflectance * alpha) / (np.max(reflectance))).astype(np.uint8) result_image = cv2.merge([adjusted_reflectance]*3) return result_image if __name__ == "__main__": input_img_path = 'under_exposed_photo.jpg' output_img_path = 'corrected_photo.png' original_image = cv2.imread(input_img_path) corrected_image = retinex_adjust(original_image) cv2.imwrite(output_img_path, corrected_image) ``` 此段代码利用了Retinex理论[^3],将原图分解成光照分量\( S \)和反射分量\( R \),并通过调节反射分量来改善图像的整体对比度和细节表现力。此外,在实际应用中还可以考虑引入更复杂的网络结构来进行光照估计,如卷积神经网络(CNN)[^1],以便更好地捕捉场景中的复杂照明条件。
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值