1. 低光照图像增强:为什么突然火了
低光照图像增强,这个方向其实在计算机视觉里算是个老话题了,但这两年热度一直在线,刷论文的频率明显比前几年高不少。核心问题很直白:在光线不足的环境下拍出来的照片,要么太暗、要么噪声大、要么颜色偏得没法看,怎么把这些图处理成清晰、自然、可用的图像。
你可能觉得这有什么难的,把亮度拉起来不就行了?真没那么简单。直接提亮会让暗部噪声一起放大,颜色也会失真,高光区域还会过曝。这背后牵扯到成像模型、光照估计、噪声建模、色彩恢复一堆问题,所以才有那么多论文在反复折腾。
这篇综述速读系列的第一篇,我先把低光照图像增强的整体技术脉络梳理一遍,包括这个任务为什么难、经典方法大概分几类、各自的思路和问题在哪里,以及常用的数据集和评价指标。后续再针对具体的技术分支逐篇展开,比如基于深度学习的方案对比、真实场景数据集的分析等。
读这篇内容适合谁?刚入门这个方向的研究生、要落地图像增强功能的工程师,或者做摄影后期工具的产品经理,应该都能从中拿到一些有价值的信息。我会尽量把论文里的核心逻辑讲清楚,不堆公式,但会告诉你每类方法的思路和边界在哪里。
2. 为什么低光照图像这么难处理
先说一个容易忽略的事实:低光照图像的问题不只是“暗”。把一张暗图的直方图拉宽,你会发现三个典型问题同时存在——噪声被放大、色彩发生偏移、细节纹理丢失。
拿噪声来说,图像传感器在暗光下的信噪比本来就低,CMOS的暗电流和读取噪声都会变得更明显。一旦用全局提亮的方式去处理,暗部区域的噪声会被成倍放大,出现那种密密麻麻的彩色噪点。这个问题在手机夜景模式里其实很常见,你放大看暗部就会发现无数彩色的“雪花”。
再说色彩偏移。低光照环境下,环境光的光谱分布往往和白天差别很大,比如路灯是暖黄色、月光是冷蓝色,相机的白平衡算法很难正确还原。很多增强算法只关注亮度通道,完全不管色度通道,结果就是处理完的图像整体偏蓝或者偏黄,观感很差。
细节丢失则是另一个维度。暗部区域的灰度值很接近,很多纹理信息都被量化噪声淹没了,直方图会挤在低灰度区间。这时候单纯做对比度拉伸,区别不大,因为信息已经没了,算法只能靠“猜”或者“编”来补细节,这就引出后面要讲的一大堆方法。
还有一个不那么显眼的坑:曝光不均匀。真实的低光照照片往往不是整体暗,而是暗部和高光区域同时存在,比如夜景里远处霓虹灯很亮、近处地面很暗。如果用一个全局映射把所有像素都拉亮,高光区必然过曝。所以低光照增强不能只看亮度分布,还要考虑空间上的光照变化,这就是为什么基于全局映射的传统方法很快就遇到了天花板。
3. 传统方法的核心思路和绕不开的问题
3.1 直方图均衡化及其变体
最朴素的做法是直方图均衡化(Histogram Equalization, HE)。思路就是把灰度直方图从集中在暗区变成均匀分布,让图像的对比度更高。直观理解就像把一个班里成绩都集中在40分的学生,强行按排名摊成0到100分都有,这样分数差距拉开了,但绝对水平并没有真正提升。
HE的缺点很明显:对噪声敏感,容易过度增强,而且处理完的图像看起来很不自然,有一种“塑料感”。后来陆续出现了CLAHE(限制对比度自适应直方图均衡化)、BBHE(保持亮度的双直方图均衡化)等变体,主要思路是把图像分块处理,并对对比度拉伸幅度做限制,避免把噪声也一起放大。
这类方法跑得很快,在低算力设备上很实用,但效果上限很低。因为算法本身没有对“光照”和“反射”做物理建模,只是重新分配灰度值,遇到复杂光照场景基本就力不从心了。
3.2 Retinex模型:照亮一切的基础
说到低光照增强,绕不开Retinex理论。这个理论的核心思想非常优雅:人眼感知到的图像,可以分解为光照分量和反射分量。光照分量代表环境光的分布,反射分量代表物体本身的属性(颜色、纹理),增强的本质是估计光照分量,把它从图像里“剥离”出来,然后对光照做调整,再和反射分量重新合成。
打个比方,一块白布在暗房里拍出来是灰的,在阳光下拍出来是亮的。Retinex就是要区分出来:颜色信息(白布)是反射分量,亮度变化(灰vs亮)是光照分量,然后把光照提上去,让白布在暗房的照片也显示出白色。
基于Retinex的经典方法有单尺度Retinex(SSR)、多尺度Retinex(MSR)、带颜色恢复的MSRCR等。这类方法比直方图均衡化效果自然不少,但也会产生光晕效应——在光照剧烈变化的边缘(比如窗户边框),光照估计不准,会留下一个明显的亮圈。
更深层的问题在于,Retinex分解本身是一个病态问题。给定一张图,光照和反射的拆分方式有无数种,传统方法通常依赖各种先验(比如光照是平滑的、反射是稀疏的)来约束解空间。这些手工设计的先验在复杂真实场景下并不总是成立,所以效果比较依赖调参。
3.3 基于物理模型的增强
另一条路线是从成像模型反推。最常用的是大气散射模型的变体,这个模型本来是用在去雾上的:成像强度 = 场景辐射 × 透射率 + 大气光 ×(1 - 透射率)。低光照图像在某些层面上和雾图有相似性——对比度低、色彩灰暗,只不过成因不同,所以有研究者把去雾方法直接迁移过来。
比较有代表性的是Dong等人在2011年的工作,把低光照图像先做反转,再当成雾图来做去雾,最后再反转回来。这个思路挺有启发性,但效果只能说一般,因为低光照和雾的物理成因毕竟不同,反转后的“伪雾”和真实雾还是有不小差别。
物理模型方法的优点是可解释性强,每一步都有明确的物理含义,但缺点也很直接:模型是简化过的,真实场景的光照和大气条件远比模型复杂,误差会一步步累积。所以这类方法在学术上有价值,实际落地比较少。
4. 深度学习方法有哪些流派
深度学习起来之后,低光照图像增强基本被神经网络统治了。整体可以分成三大流派:基于监督学习的、基于半监督/无监督学习的、基于特定任务联合优化的。每种流派背后都有典型的论文和设计思路,我逐个展开讲。
4.1 有监督学习的开局与困局
最早期的深度学习方案,直接端到端训练一个CNN,输入暗图、输出亮图,用成对的暗图/亮图数据来监督。LLNet是比较早的工作之一,用堆叠的稀疏自编码器做增强。
真正的分水岭是2018年的RetinexNet,它把Retinex理论塞进了网络结构里:一个分解网络(DecomNet)把输入图像分解成光照图和反射图,然后用一个增强网络处理光照图,最后合并输出。这样做的好处是网络结构本身带有物理意义,效果比纯黑盒CNN更可控。
但RetinexNet的核心痛点也很明显——它需要成对数据。低光照图像增强的数据集构建本身就非常难:你没法让同一个场景在完全相同的光照条件下同时拍一张暗图、一张亮图,因为拍摄时间不同、手抖、物体移动都会引入干扰。
合成数据倒是容易做,给亮图手动调低亮度再加噪就行,但合成数据和真实暗光场景之间的域差距太大,模型在合成数据上训练得再好,到真实照片上还是拉胯。这就是有监督方法面临的核心矛盾。
4.2 无需配对数据的半监督与无监督路线
为了解决配对数据难获取的问题,研究者开始探索不依赖配对数据的方法。
一个代表性工作是EnlightenGAN。它采用GAN架构,用全局-局部判别器来区分增强结果和真实亮图,同时加入了色彩恒常性损失和感知损失来约束输出质量。不需要严格成对的数据,只在循环一致的框架下学习映射关系,这在实际应用中友好很多。
另一个思路是零参考(Zero-Reference)方法,以Zero-DCE为代表。这个方法的网络结构其实不复杂,核心贡献在于设计了几个不需要参考图就能计算的无参考损失函数:
- 空间一致性损失,让相邻像素的亮度变化趋势保持一致;
- 曝光控制损失,把亮度向期望的曝光水平靠拢(一般设为0.6左右);
- 色彩恒常性损失,用灰度世界假设约束三个颜色通道的比例;
- 光照平滑损失,防止光照图出现剧烈跳变。
这四个损失函数配合一个轻量网络,就能在不同光照条件下做增强,而且是逐像素动态调整的,效果很自然。Zero-DCE系列后来还出了增强版本,引入了感知损失和颜色损失,实际效果又提升了一截。
无监督方法最大的优势是训练数据好收集——随便拿一批亮图就行了,不需要配对。但代价是增强效果的上限受损失函数设计约束,遇到极端低光照场景有时候会翻车。
4.3 特定任务联合优化与真实数据的回归
第三派思路不再孤立地做“增强”这一步,而是把增强和目标任务捆绑在一起。
比较典型的是做人脸检测的——直接对暗图做人脸检测效果很差,一是有专门的暗光人脸检测数据集和算法,把检测器设计成能在暗图上直接提取特征,或者把增强网络和检测网络联合训练,让增强的结果更适合检测器使用。低光照目标检测、夜间语义分割、暗光OCR都属于这类范畴。
另一个关键变化是真实数据集的回归。前面提到合成数据有域差距,所以这几年陆续出现了用长曝光、短曝光配对方式采集的真实低光照数据集,比如MIT的See-in-the-Dark系列。这类数据集的构建方式是固定相机,拍一张短曝光暗图和一张长曝光亮图作为参考,尽量把拍摄间隔缩到最短来减少动态物体影响。
用真实数据训练的优势很明显,模型在真实场景的泛化能力大幅提升。但真实数据集的采集成本很高,而且不同场景对“增强”的目标定义不同——有人希望增强后亮度尽量接近长曝光参考图,有人希望保留夜景氛围,标准本身就有主观性。
5. 数据集和评价指标:算法好坏的尺子
5.1 常用数据集一览
低光照增强常用的数据集,我列成表格说说各自的特点:
| 数据集 | 类型 | 规模 | 特点与适用场景 |
|---|---|---|---|
| LOL | 真实配对 | 500对左右 | 室内外场景,暗图/亮图通过曝光时间差异获取,经典基准 |
| MIT Adobe FiveK | 真实配对 | 5000张 | 专业摄影师手动调图作为GT,主要用于图像增强与色调映射 |
| SID | 真实配对 | 5094个场景 | 索尼/富士相机短长曝光配对,极暗光,偏向RAW域处理 |
| LIME | 无GT | 真实暗图 | 只有暗图,用于无参考评价,适合测试增强算法主观效果 |
| DARKFACE | 真实暗图 | 约6000张 | 人脸检测专用低光照数据集,暗光人脸检测benchmark常用 |
选数据集要结合你实际的任务。如果做学术刷指标,LOL是标配;如果做手机拍照算法,SID这种RAW域的更贴近真实pipeline;如果是做视频监控或安防场景,DARKFACE或自己采的数据会更有说服力。
5.2 有参考与无参考评价指标
增强算法的评价指标分两类:有参考(需要GT亮图)和无参考(只有暗图输入)。
有参考指标最常用的是PSNR(峰值信噪比)和SSIM(结构相似性)。PSNR衡量的是像素级误差,SSIM衡量的是亮度、对比度、结构三个维度的相似性。还有个基于感知的指标是LPIPS,它用深度网络特征的距离来度量图像感知差异,和人的主观感受相关性更高,现在的论文基本都会报这个指标。
但PSNR和SSIM有个公认的毛病:它们和人眼感受的相关性并不好。一个算法PSNR刷得高,肉眼看起来反而可能偏色、不自然。所以论文里一般都要搭配可视化结果做主观对比,不然没法说服人。
无参考指标主流是NIQE和BRISQUE,它们假设自然图像有一些统计规律,增强后的图越符合这些规律,分数越高。零参考方法的论文里会特别依赖这类指标,因为没有GT,只能用统计模型来评价。但无参考指标的问题也不少,很多时候一个明显偏红的图NIQE分数反而很高,所以只能作为参考,不能全信。
6. 现实场景里的坑和我的建议
看完这么多方法,你可能会问:实际项目里到底该选哪条路?
根据我做过的落地经验,先说几个真实的坑。
第一个坑是算力限制。很多低光照增强模型在论文里效果很好,但用的是高分辨率输入加上多层网络,推理耗时不低。如果目标是手机或嵌入式设备上的实时处理,像Zero-DCE这种轻量模型勉强能跑,但效果上限有限;RetinexNet那类重量级网络基本告别移动端。落地前一定先明确目标分辨率和帧率,再倒推选型,别等模型训完了才发现跑不动。
第二个坑是评价指标的迷惑性。之前有个项目,我们团队把算法PSNR刷得比baseline高了好几个dB,但产品经理拿着样张直接否了——因为暗部细节恢复是好了,但人脸肤色偏得离谱。后来我们加入了色彩损失和感知损失重新训练,PSNR反而掉了一点,但主观效果和用户评分都上去了。做增强算法的优化目标,一定要结合实际使用场景,不能只盯指标。
第三个坑是合成数据的过拟合。用合成数据训练出来的模型,看起来在测试集上很能打,一旦拿到真实夜景视频里就原形毕露,不是发绿就是颗粒感爆炸。个人建议是:训练阶段以合成数据为主没问题,但一定要在真实场景数据上做微调,哪怕真实数据只有几十张,效果提升都会非常明显。
那到底怎么选?我按场景给一个简单参考:
- 学术研究、刷基准指标:用LOL数据集,选有监督方法作为baseline,逐步加模块改进,这是最容易出成果的路径。
- 移动端实时处理:优先考虑Zero-DCE这种轻量设计方案,或者干脆用CLAHE加轻量去噪模块,传统方法和深度方法结合的性价比最高。
- 高画质后处理(如摄影App):建议用EnlightenGAN或基于Transformer的增强模型,计算量大但画质上限高,色彩还原更自然。
- 视频监控等暗光检测任务:不要单独做增强步骤,直接把增强网络和检测网络联合优化,或者去掉增强环节改用暗光鲁棒的特征提取结构,端到端的最终性能通常会更好。
7. 后续系列会聊什么
这篇是综述的第一篇,聊的方向偏宏观——任务难点、方法分类、数据集、评价指标,以及路线选型的大体判断。很多细节我只是一笔带过,没有深入解析,后面我会围绕几个关键主题逐个展开。
下一期可以聊基于深度学习的低光照增强方法做一次横向对比,把RetinexNet、EnlightenGAN、Zero-DCE、SCI(Self-Calibrated Illumination)等代表性模型放到同一评测框架下,跑一遍PSNR、SSIM、LPIPS和推理速度,看看哪些方法是“指标好看但不好用”,哪些是“效果能打而且能落地”。
之后还可以单独拆解Zero-DCE的损失函数设计细节,看看那几个无参考损失是怎么想出来的;或者用真实数据集做一次增强效果的主观评测,找出评测指标和肉眼感受的偏差到底在哪。欢迎关注这个系列,也可以留言告诉我你现在遇到的具体问题,比如是训练数据不够还是增强结果不自然,我会优先安排。