资讯详情

低光图像增强两大经典:RAW直出与Retinex分解实战解析

📅 2026/10/16 12:09:45 | 华诺云谱 👁 阅读
低光图像增强两大经典:RAW直出与Retinex分解实战解析
夜景拍出来的照片一团黑、噪点糊成一片这大概是所有摄影爱好者和做视觉算法的人都绕不过去的坎。我早年在做安防监控图像质量调优的时候被低照度视频折磨得不行后来接触到两篇经典工作一篇是 Learning to See in the Dark另一篇是 Deep Retinex Decomposition for Low-Light Enhancement也就是大家常说的暗光RAW直出网络和RetinexNet。这两篇论文基本奠定了低光图像增强的两个主流方向直到现在很多新方法里还能看到它们的影子。这篇博文就把我个人对这两条路线的理解、复现过程中的细节、踩过的坑一次性说清楚。这篇文章适合刚入门低光增强的研究者、做图像画质的算法工程师以及想把手里的暗光照片处理得能看的开发者。我会把 RAW 直出和 Retinex 分解这两套思路掰开揉碎讲明白再附上可落地的数据准备、训练策略和问题排查经验。1. 为什么说这两篇论文是整个低光增强方向的基石低光图像增强这件事说起来简单做起来全是坑。直接拉亮度吧噪声跟着一起放大做去噪吧暗部细节又容易糊成一团想靠直方图均衡化救一救色彩偏得没法看。传统的图像处理手段在暗光场景下几乎是捉襟见肘。1.1 低光图像的三重困境低光图像的本质困难有三个理解这三个困难才能明白为什么传统方法不中用。第一是信噪比极低。在暗光环境下传感器接收到的光子少信号的随机涨落相对于有效信号来说占比非常高反映到图像上就是亮度和彩色噪声严重。这个噪声不是简单的椒盐噪声而是同时包含高斯噪声和泊松噪声的混合体而且在RGB三通道上还不独立。第二是动态范围受限暗部细节被压缩到接近0的低灰度区间线性量化之后相邻灰阶之间的差距极小拉伸亮度时容易出现条带和断层。第三是颜色失真暗光下白平衡本来就难做加上不同波长的光衰减不一致拍出来的颜色经常是诡异的偏色。传统救急手段为什么不行伽马校正只做全局亮度映射直方图均衡化只做对比度拉伸它们根本没有回答哪些信号是噪声、哪些是细节这个根本问题所以一拉亮度就把噪声的丑态全暴露了。1.2 从两个完全不同的切入点解决同一个问题这两篇论文的聪明之处在于它们各自选了一个极具说服力的切入点来破解低光增强这个难题。Learning to See in the Dark 选择直接从 RAW 传感器的原始数据下手。它的核心洞察是大部分暗光信息的损失发生在从 RAW 到 sRGB 的 ISP 流水线中暗光下的 RAW 数据虽然看起来也是黑的但其中保存的线性光子计数信息远多于已经被非线性映射和压缩过的 sRGB 图像。与其在畸形的 sRGB 图像上折腾不如直接从 RAW 端做端到端学习。RetinexNet 则从成像理论的物理模型出发。Retinex 理论认为人眼感知到的图像颜色和亮度本质上取决于物体表面的反射特性光照部分只是一个乘积因子。如果把一幅图像分解成光照图和反射图增强过程就可以拆成两步把光照图调亮、把反射图的噪声压下去各自处理互不干扰最后再乘回去就是增强结果。有意思的是这两条路线在2018年前后是同时期出现的一个靠数据暴力拟合一个靠物理先验约束恰好代表了深度学习时代图像增强领域的两大范式端到端黑盒和物理模型引导。1.3 两篇论文共同的贡献把暗光增强从调参玄学变成可学习的函数在它们之前低光增强基本靠人工设计特征和统计先验效果不稳定泛化能力差。这两篇论文用数据驱动的方式把暗图变亮图这个映射变成了一个可优化的函数而且都在公开数据集上给出了可复现的指标提升。对后来者的影响尤为深远。现在看到的很多低光增强模型要么在结构上沿用类似 U-Net 的编解码框架要么在思路上沿用 Retinex 分解-增强的显式流程要么直接在 RAW 域做端到端学习。搞懂这两篇论文等于拿到了一把打开低光增强大门的钥匙。2. RAW直出与Retinex分解两条技术路线是怎么设计的2.1 Learning to See in the Dark 的端到端思路拆解这篇论文最被低估的设计决策是输入域的选择。我最初复现时想着省事直接用 sRGB 图做输入效果一塌糊涂后来老老实实换成 RAW 输入指标立刻上了一个台阶。原因在于 sRGB 图像已经经过了白平衡、去马赛克、色彩校正、伽马压缩这一整套有损处理暗部的量化精度被严重破坏而 RAW 数据还是线性域暗部信息保留完整。具体实现上网络输入是 Bayer 排列的 RAW 图。这里有一个关键操作把每个 2x2 的 RGGB 拜耳单元拆开成 4 个通道也就是说输入张量的形状是 H/2 x W/2 x 4而不是一张普通的单通道灰色图。这个重排操作非常巧妙既保留了拜耳阵列的原始空间关系又让卷积神经网络的通道维度能够自然处理不同颜色的响应差异。网络主体是编码器-解码器结构没有用全连接层好处是可以处理任意尺寸输入。损失函数用的是简单的 L1 损失要求网络输出和参考长曝光图像在 sRGB 域上像素级接近。训练时的关键技巧是曝光比匹配一对训练数据中短曝光图像和参考长曝光图像之间的曝光时间差是一个已知常数网络输出的亮度需要按这个比例放大才能和参考图对齐否则损失函数根本没法收敛。推理时还有一个容易忽略的细节如果输入是 3 通道的 RAW 图比如某些黑白传感器或者特定滤镜需要先补齐成 4 通道拜耳格式再送进网络。2.2 RetinexNet 的物理分解流程RetinexNet 遵循一个先分解、再增强的两段式流程。第一段是 Decom-Net把输入的低光图像分解为光照图和反射图。第二段是 Enhance-Net内部又包含一个去噪子网和一个亮度调整子网让被分解出来的反射图去噪、光照图提亮然后相乘重建出增强结果。这个设计的好处是模块职责非常清晰。光照图本质上是平滑的亮度场处理它的动态范围压缩很安全反射图包含物体本身的纹理和颜色信息主要矛盾是噪声抑制。分开处理之后增强操作不会像直接亮度映射那样把细节和噪声搅在一起。损失函数设计是 RetinexNet 最有营养的部分它一共组合了多个损失项。首先是重建损失保证分解出的光照图和反射图相乘后能还原原图其次是光照平滑度损失约束光照图在纹理边缘处不过度起伏还有反射图一致性损失确保同一场景在不同光照下分解出的反射图保持一致再加上结构相似性损失来维持细节质量。我在实际复现中感受最深的是光照平滑度的权重不能调得太大否则增强结果会出现塑料感像蒙了一层磨砂玻璃亮部和暗部的过渡极不自然。2.3 两类方法各自的优势和软肋RAW 直出端到端方法的优势是上限高理论上只要训练数据足够丰富网络可以学会从底层传感器数据到理想图像的完整映射不依赖任何显式物理模型噪声模式和颜色映射都能被隐式建模。但它的短板也很明显必须依赖 RAW 数据移动端成像链路复杂很多场景根本拿不到相机原生的 RAW 输出而且网络所学到的映射高度依赖训练数据的传感器型号和 ISP 风格跨设备迁移时往往需要重新训练或者做领域自适应。Retinex 分解方法的优点是物理可解释性强模块之间职责清晰增强流程中的中间结果光照图、反射图可以直接可视化方便调试。它对输入格式的要求也很宽松普通 sRGB 图像即可工作工程落地门槛低。缺点则是显式物理模型本身是一个强先验真实世界并不严格满足 Retinex 假设比如镜面高光、复杂遮挡场景下分解本身就容易出错而且固定流程限制了网络的表达空间极限暗光下表现不如端到端方法。从工程选型的角度看如果手里有干净的 RAW 数据链路端到端方法是首选如果只能在 sRGB 输入上折腾Retinex 分解框架是更稳的底座。3. 复现实战数据集、工程环境与训练调参的完整过程3.1 数据集准备从论文描述到实际可用的训练对数据是所有实验的地基。低光增强任务需要成对的训练数据也就是弱光输入图 正常亮度参考图这样的配对。公开可用的数据集中比较典型的有两类一类是弱光短曝光和正常长曝光的 RAW 配对数据另一类是成对的 sRGB 低光/正常光图像数据后者通常是通过后期模拟降光和加噪生成的。拿到数据后的第一步是检查配对对齐情况。即便是公开数据集偶尔也会出现图像序列错位或者曝光比标注不一致的现象不能盲目全信。我习惯在训练前写一个脚本把训练对逐张拼在一起输出成视频帧序列快速扫一遍有没有错位或亮度异常这一步能帮你在后续训练时少走很多弯路。数据处理管线里最关键的几个环节是暗图亮度的对齐归一化不同曝光比会导致输入输出的数值范围差异巨大需要把输入除以曝光比让输入在亮度量纲上先和参考图对齐网络只需要学习残差和细节恢复。图像分块低光数据往往分辨率很高直接整图训练显存吃不消通常按 512x512 或 256x256 的尺寸随机裁剪配合随机翻转和旋转做数据增强。数值类型与归一化RAW 数据处理要格外注意数值精度强烈建议用 32 位浮点处理不要中途转成 uint8否则暗部细节在量化时已经丢光了。我训练时用的是一块消费级中高端显卡batch size 取 4裁剪尺寸 512显存余量还比较宽裕。如果你的显卡显存小降裁剪尺寸比降 batch size 更稳妥因为尺寸降到 256 时增强效果明显变肉。3.2 工程实现模型结构的落地要点复现 Learning to See in the Dark 的网络结构时最需要注意的就是通道重排和上采样之间的衔接。输入重排成 H/2 x W/2 x 4 之后空间分辨率已经减半后续编码器每降采样一次空间信息都会进一步损失因此解码器的上采样次数必须相应调整否则输出尺寸和参考图对不齐。我在第一次实现时就因为忘记把上采样次数加回来导致输出尺寸变成输入的 1/4调试了半天才发现是结构对齐问题。RetinexNet 的工程实现顺序建议先做 Decom-Net 的单独预训练。用重建损失把光照图和反射图的分解能力先训出来可视化一下分解结果确认光照图确实平滑、反射图确实保留了纹理再接上增强网络端到端联合调优。这个分阶段策略不仅能降低训练难度还能在你进行错误定位时分清是哪一部分出了问题。代码框架我用的是 PyTorch有几个细节值得注意网络输入输出统一用torch.float32不要在 forward 里混入半精度操作。损失函数的计算放在通道维上还是空间维上结果有细微差别建议统一为逐像素差值后求均值。训练过程中保留最近 5 个 epoch 的权重方便回滚到效果最好的版本。3.3 训练策略学习率、批大小与损失权重的平衡训练低光增强模型经验法则第一条是不要一上来就用太大的学习率。这个任务看起来是回归任务实际上对细节的敏感程度极高学习率稍大就容易在 L1 损失几乎不变的情况下丢失纹理细节。我自己试下来初始学习率 1e-4 搭配余弦退火是稳妥的选择先用小学习率跑 5 个 epoch 观察损失落底情况再逐步加上数据增强强度。损失权重的调节顺序也有讲究。如果是 RetinexNet 这类多损失组合的模型先把重建损失的权重固定为 1把其他损失项调零跑一个能收敛的基线然后逐个加入平滑损失、一致性损失每加入一个就观察它对重建指标的影响。这样能清晰看到每个损失项在干什么而不是一上来就把五项损失叠一起出了反例根本没法定位。曝光比的匹配在端到端 RAW 训练里怎么强调都不过分。我在复现 Learning to See in the Dark 时犯过一个低级错误训练前计算曝光比时用的基准参考帧选错了导致所有输入图都被不正确地缩放模型训练虽然能收敛但增强结果总是出现全局偏色。后来写了一个自动检测曝光比匹配的代码在训练过程中周期性抽查解码输出的均值才定位到问题。经验是把数据预处理和训练分成两个独立脚本分开调试别在 Jupyter 里东拼西凑。3.4 评估指标PSNR 和 SSIM 的正确打开方式低光增强常用的两个客观指标是峰值信噪比PSNR和结构相似性SSIM。但这两个指标在低光增强任务里有几个容易踩的坑。PSNR 对全局亮度偏移非常敏感如果网络输出的平均亮度始终比参考图低PSNR 会很难看。所以评估前我会先计算一个全局亮度校准系数把输出图的均值对齐到参考图再计算 PSNR这样能更公平地反映增强质量。SSIM 则对局部纹理和对比度更敏感在暗部区域会因为噪声导致数值偏低。建议评估时分区域计算单独统计暗部区域的 SSIM这样能直观看出去噪是否到位。指标之外目视评估绝对不能省。我每次训练完会随机抽一批暗光图把输入、输出、参考图按三联画对比摆出来看。很多时候 PSNR 高了但视觉上偏色严重或者暗部死黑这都是指标的盲区。低光增强最终服务的还是人眼不可能完全交给数字评判。4. 我在复现过程中踩过的坑与问题排查实录4.1 训练数据预处理顺序不当导致无法收敛第一次跑通整个训练流程花了不少时间但训练到第 100 轮损失死活降不下去。排查了一圈才发现是数据管线的顺序问题我先做了图像增强旋转、翻转再做亮度对齐这导致旋转时插值算法改变了 RAW 图像的拜耳排列规律后续的通道重排步骤拿到的是错乱的数据。正确的做法是先对 RAW 数据进行通道重排再做空间变换或者把所有空间操作改成不涉及像素值插值的方式例如只做翻转这样才能保证拜耳结构的一致性。4.2 光照平滑损失的权重过度导致塑料感复现 RetinexNet 时我把光照平滑损失权重拉得比较大希望光照图尽量平滑结果是增强出来的图像过度亮化均匀物体的轮廓和立体感严重丢失就像用磨皮滤镜处理过的平面图。后来反复调参发现这个权重控制在重建损失权重的十分之一左右比较合适而且平滑损失的计算应该放在光照图梯度上而不是光照图本身否则只是把亮度值压平而不是让光照场更平滑。4.3 评估阶段的尺寸对齐陷阱另一个容易忽略的坑出现在评估阶段。有些预训练模型的输出尺寸与输入不完全一致特别是当输入长宽不是 2 的幂时经过多次下采样和上采样后边缘尺寸会有几个像素的差异。如果直接拿原图尺寸的参考图来计算 PSNR维数不匹配就会报错很多人的解决方式是 resize 输出但 resize 的插值方式会影响最终数值。更优雅的做法是中心裁剪对齐把输入、输出、参考图都裁剪到相同的中心区域再评估这样既避免了尺寸问题也避免了边缘伪影对评估结果的干扰。4.4 低光增强效果发灰的排查套路在真实场景中测试训练好的模型最常见的问题是增强结果发灰——暗部是亮了但颜色饱和度极低整体像褪了色的老照片。排查套路是先检查输出图像的直方图看 RGB 三通道的均值分布是否接近。如果三通道均值不平衡大概率是白平衡处理或者预处理的归一化参数不对如果三通道均值相近但整体灰度化可能是网络的色彩表达能力不足常见原因是通道数设置过少或者在数据增强阶段把颜色增强搞得太狠导致网络学到了忽略颜色的捷径。4.5 常见问题速查表现象可能原因排查方向训练损失不降曝光比未对齐 / 输入输出尺寸不匹配检查预处理脚本里曝光比基准帧打印输出张量尺寸增强结果全局偏色白平衡预处理错误 / 归一化统计量不匹配比对训练集和测试集的光照分布检查归一化参数暗部噪声反而放大去噪能力不足 / 损失函数太关注整体亮度增加暗部区域的损失权重或者先做噪声水平估计输出发灰不鲜艳色彩通道表达能力不足检查颜色增强强度提高通道数或加入颜色损失项推理速度太慢模型过大 / 输入分辨率过高考虑轻量化结构、通道剪枝或者分块推理5. 从复现到实际工程落地的几条经验5.1 真实场景和论文数据的差距论文里的数据集再规范到了真实场景还是会遇到一堆幺蛾子。实际部署时你拿到的输入可能不是干净的 Bayer 阵列而是经过 ISP 后处理但参数未知的 YUV 图传感器型号千差万别基准曝光时长、增益参数全都拿不到视频流场景还有帧间亮度闪烁问题单帧增强模型连续推理时画面会忽亮忽暗。我在某个监控画质优化的项目里试过把端到端 RAW 模型直接应用到现场效果很差后来换成了 Retinex 分解框架配合一整套自适应亮度归一化预处理勉强做到了可用。原因是现场根本拿不到 RAW 数据而且光照条件复杂多变显式的物理分解更容易做约束和调试。5.2 模型轻量化与实时性是绕不开的关卡低光增强模型要真正跑进手机或者嵌入式设备轻量化是必修课。一般的做法是把标准卷积替换成深度可分离卷积把编码器的通道数从 64 一路降到 32、16同时配合蒸馏策略用大模型当老师小模型学输出去逼近老师的增强效果。我实测过一个通道数减半的轻量 RetinexNet在手机上处理 720p 图像的速度能提升两倍以上指标掉得不多大约在 1 到 2 个分贝的 PSNR 范围内。轻量化过程中最需要注意的是不要盲目剪枝要保住光照图分支的能力因为它是整个增强流程的亮度和色彩开关。5.3 与当前新方法的关系零参考学习和扩散模型都在站在巨人的肩上这两篇论文的影响不止于它们本身。现在很火的零参考低光增强方法本质上是用一组精心设计的损失函数去约束增强结果思路源头就是 Retinex 分解中光照图应该平滑、反射图应该保持一致性的先验。基于扩散模型的低光增强方法则把 RAW 直出网络的端到端思路继承了下来只不过把确定性映射换成了生成式采样从而能更好地还原纹理细节。所以我的建议是低光增强方向的新手不要一上来就追最新的扩散模型先亲手复现这两篇经典论文把数据预处理、模型结构、损失函数设计、指标评估这一整套基本功练扎实再看新方法时会发现思路脉络异常清晰。6. 我的几点实操心得低光增强是个典型的看着简单、做起来到处都是坑的方向。我在复现这两篇论文的过程中感触最深的是三件事。第一数据预处理的重要性远远超过模型结构。网络上很多人喜欢争论哪个网络结构更先进但实际上多轮实验下来决定效果上限的往往是数据处理管线的细节尤其是曝光比对齐、拜耳重排顺序和归一化方式。这几步做对了哪怕模型结构简单指标也能做到不错。第二中间结果可视化是调试的神器。RetinexNet 能输出光照图和反射图这个特性让我在定位问题时省了大量时间。强烈建议在端到端模型的训练过程中也定期 dump 一些中间层输出把网络心里想的可视化出来很多问题一眼就能看出来远比盯着 loss 曲线猜有效。第三不要迷信公开指标。PSNR 和 SSIM 只能反映增强质量的某一方面真正拍板的是目视效果。我在项目验收时从来都是把增强前后的图像摆在一起让业务方自己看数字只是一种辅助参考。最后分享一个小技巧训练低光增强模型时可以在损失函数里加一个感知损失项用预训练的分类网络提取特征图在特征空间约束增强结果和参考图的相似性。这个小改动在恢复纹理细节上效果立竿见影尤其是暗部纹理很多只用 L1 损失的模型在这里翻车加了这个项之后明显改善。我在两个模型的复现中都验证了这个结论推荐你也试试。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑