水下图像增强:深度学习与物理模型结合估测透射率

发布时间:2026/10/14 1:40:40

水下图像增强:深度学习与物理模型结合估测透射率 研究水下图像增强的人基本都绕不开同一个开场水下照片要么偏蓝要么偏绿再离远一点就开始发糊像蒙了一层半透明的纱。这个现象不是相机白平衡没调好而是水体光学特性决定的。光线从场景表面反射回来在水里走过一段路程后才能到达相机路径上同时发生吸收和散射红色波长衰减最快蓝绿波长穿透力强再加上水中无处不在的悬浮颗粒散射最终成像就是典型的蓝绿色调、低对比度、细节丢失。这篇《A Deep CNN Method for Underwater Image Enhancement》就是冲着这个退化问题来的核心思路是用深度CNN估计出透射率图再结合物理模型把清晰图像反推出来。整篇论文读下来最值得琢磨的不是它用了多新的网络结构而是它对物理模型深度学习这种混合路线的处理方式。论文没有让CNN从头到尾独立完成图片增强而是把最难的透射率估计交给网络背景光估计则沿用传统统计方法再用经典的Jaffe-McGlamery成像模型做图像重建。读之前建议先把水下成像模型和大气去雾的框架过一遍不然很容易迷失在公式和实验表格里。这篇文章我就按自己的阅读顺序把论文从问题定义、方法设计、训练数据、实验评估到复现踩坑一条线串下来讲清楚。1. 水下图像为什么又蓝又糊从成像退化说起下水拍过照的人都有体感水越深、距离越远图像糊得越厉害色彩也越单调。但这只是定性感受要做算法就必须把退化过程写成数学形式。业内最常用的就是Jaffe-McGlamery水下成像模型可以写成I(x) J(x)·t(x) A·(1 - t(x))这里x是像素坐标I(x)是相机拍到的退化图像J(x)是希望恢复的清晰场景辐射t(x)是透射率图取值在0到1之间A是全局背景光。直观理解一下t(x)越接近1说明这段光路衰减越少看到的物体就越清楚t(x)越接近0说明物体反光几乎全被水吸收和散射掉了相机只能拍到背景光。A则是水里远处那层底色通常偏蓝偏绿它不依赖具体物体相当于一个全局偏置项。把式子反推一下就得到图像恢复的核心公式J(x) (I(x) - A) / t(x) A看到了吗只要估计出t(x)和A理论上就能把清晰图像还原出来。这篇论文的方法本质上是在给这个反推公式补参数而不是去学一个退化图直接映射增强图的黑盒。这个选择在2017年前后有很强的现实意义真实水下图像很难拿到成对的清晰参考图端到端模型训练数据不够容易过拟合而且出了问题不好解释。物理模型把问题拆解成估计两个物理量训练数据也能靠模型反向合成整个技术路线就闭环了。不过这里必须强调一点物理模型给了反推形式并没有给唯一解。同一个I(x)可以对应很多组不同的(J, t, A)组合这是一个典型的不适定问题。水下图像增强难难的不只是怎么算更在于怎么在无穷多解里找到那个符合真实物理的那一个。后文的CNN方法本质上是利用大量合成数据在图像外观—透射率之间学一个统计优先的映射把解空间往合理的方向挤。2. 方法定位为什么只让CNN学透射率图不学全部很多初学者读这篇论文时会有一个疑问既然物理模型已经给出了公式直接套暗通道先验估计透射率不就行了为什么还要引入CNN答案在于暗通道先验在水下场景经常失效。大气去雾里的暗通道先验假设无雾清晰图像的局部暗通道趋于零这个假设在陆地场景大体成立但水下大片的蓝绿色背景本身就是高亮的暗通道不再接近零先验被破坏估计出的透射率往往偏高导致恢复图偏暗、偏蓝。CNN在这里的作用就是绕开这个脆弱的先验假设直接学习从图像外观到透射率图的映射。网络输入退化图像输出对应的透射率图中间过程完全由数据驱动不用人手工设计复杂的先验规则。论文很聪明的一点是没有把增强任务整个交给网络端到端输出J而是只输出t。这样做的逻辑其实非常工程化A的估计相对稳定用传统统计方法就够t的空间变异性强和场景深度、水体浓度、光源分布都挂钩传统方法始终做不干净这才是数据驱动模型的用武之地。这个只学最难子模块的思路在今天的很多AI系统里其实很常见用神经网络解决感知或回归问题用传统算法解决可解释、可验证的部分。论文选择这种混合架构还有一个隐性好处调试方便。恢复效果一旦不对劲可以分别检查是t估计错了还是A估计歪了而不是对着整个黑盒模型无从下手。我在实际复现之后对这个体会特别深——如果端到端模型输出一张偏红的图你很难定位是解码器哪一层出了问题但在这套管线里你只要把中间t图和A打印出来问题基本就浮出水面了。2.1 透射率图和背景光的耦合关系这里要补一个容易忽略的细节。从恢复公式看A和t在反推过程中是耦合的A偏大一点t就得跟着变才能让最终J看起来正常A偏小t的估计也会被带偏。换句话说网络学到的t隐含了训练时A分布的依赖。如果真实测试图像的A估计值和训练数据里的A分布差异很大网络预测的t就会不准。论文在合成训练数据时显然考虑到了这点会对A做一定范围的随机采样让网络见过更多组合。但考虑到CNN模型并不直接看到A作为输入特征这种内化了A的分布的透射率估计本质上仍然只是对训练分布的一个插值。这个局限性在后来的很多水下图像增强论文里被反复讨论也直接启发了把A也作为网络预测目标或者分通道处理不同波长衰减等改进思路。3. 网络结构与合成训练数据值得逐行抠的细节论文的网络结构单独拎出来看不算惊艳卷积、池化、全连接、上采样几个模块的组合在今天已经是基本功。但放在当时它把分类网络里耳熟能详的组件迁移到单通道透射率回归上来本身就是一个很好的示范深度学习解决问题不一定要硬造新结构把一个合适的结构放到合适的问题上同样有效。3.1 网络结构从多尺度特征到低分辨率透射率图网络大致可以分成两段。第一段是常规的卷积特征提取用若干卷积层加池化层逐步把输入图像压缩成高语义、低空间分辨率的特征图。池化的作用和分类网络一样是为了扩大感受野。透射率估计特别需要全局视野图像里一片很暗的区域可能是远处目标被水严重衰减也可能是近处遮挡产生的阴影只看局部很难判断必须借助更大范围的信息来推断场景深度。第二段是回归输出部分。这里有一点和后来的主流分割网络不同它不是全卷积输出逐像素稠密结果而是把特征压到全连接层先生成一张低分辨率透射率图再做上采样放大回输入尺寸。这种做法的优点是输出天然平滑全连接层很难产生逐像素激烈跳变的噪声图对透射率这种低频物理量来说是好事缺点是空间分辨率受限上采样后边缘细节会比较模糊近景物体的轮廓处容易出现过平滑。很多复现版本在实现时会采用类似下面的结构注意这只是一个工程参考不完全等同于论文原版网络网络层输出尺寸说明输入层H×W×3RGB图像除以255归一化卷积层13×332通道ReLUH×W×32提取低级特征池化层2×2(H/2)×(W/2)×32扩大感受野卷积层23×364通道ReLU(H/2)×(W/2)×64提取中层特征池化层2×2(H/4)×(W/4)×64进一步压缩卷积层33×3128通道ReLU(H/4)×(W/4)×128提取语义特征全连接层低分辨率t向量映射为透射率图雏形上采样双线性插值H×W×1放大到输入尺寸一个容易忽略的细节是损失函数的计算位置。如果网络先输出低分辨率t图再上采样那逐像素损失是在上采样后的原图尺寸上计算还是在低分辨率上计算训练结果会有差别。按多数实现习惯普遍做法是在上采样后对原图尺寸计算损失梯度会穿过上采样层让低分辨率特征也学会关注边缘区域的精度。不过这会增加训练开销想要节省显存也可以先在低分辨率上算损失再附加一个可选的边缘约束来补细节。3.2 合成训练数据用物理模型伪造退化水下图像水下增强方向最大的痛点是缺少成对数据。真实水下拍摄几乎不可能在同一视角拿到退化和清晰两版照片即便人为清理水体光线、悬浮物、拍摄位置也不可能完全复现。论文采用的方法是用物理模型主动制造退化取一张清晰的陆地图像作为J随机生成透射率图t和背景光A然后代入退化公式合成水下图像。数据合成的伪代码大概是这样的import numpy as np def synthesize_underwater(J, A, t_modeglobal): H, W J.shape[:2] if t_mode global: t np.random.uniform(0.4, 1.0) t_map np.full((H, W), t) else: # 平滑空间变化的透射率场模拟不同场景深度 t_map np.random.uniform(0.2, 1.0, size(H//8, W//8)) t_map np.kron(t_map, np.ones((8, 8))) t_map np.clip(t_map, 0.1, 1.0) I J * t_map[..., None] A * (1 - t_map[..., None]) return I, t_map这里的难点全在随机生成上。t如果是整图统一常数模型学到的就是全局去雾t如果做随空间平滑变化模型还要理解场景深度差异。A的采样则模拟不同水体的背景光常见的做法是让RGB三个通道在0.4到1之间随机采样并让蓝绿色通道偏高使合成图像更接近真实水下的偏色。合成数据的好处是能拿到逐像素精确的t真值训练时直接监督坏处是和真实水体的光学特性仍有差距后面实验部分会看到这个差距带来的泛化问题。3.3 损失函数与训练配置的细节论文的损失函数极其简单就是对估计透射率图和真实透射率图做逐像素MSE。这个选择看着朴素其实很有针对性透射率图取值范围固定输出是单通道任务本质是回归而不是图像生成不需要感知损失、对抗损失那套复杂设计。MSE对小误差敏感梯度传播稳定配合简单的网络结构足够奏效。训练时有几个配置需要留意。输入图像尺寸会影响全连接层之前的特征维度训练和推理最好保持一致中途改尺寸会出现维度不匹配。学习率方面MSE返回的梯度本身不大过大的学习率会导致loss曲线剧烈震荡太小又会收敛极慢建议从1e-4这个量级起步配合学习率衰减策略。输入图像归一化到0~1区间是必要操作不要带着0~255的原始像素值直接进网络否则前几层卷积的输入范围过大数值很容易失控。最后透射率图的下限约束强烈建议做恢复公式里有1/t项t接近0时噪声会被极度放大通常限制到0.1到0.2之间。4. 实验设计中的亮点与局限指标、对比与泛化问题论文的实验分成两条线合成测试集上算量化指标真实水下图像上做主观视觉比较。这个设计当时很标准因为真实水下图像没有参考真值只能靠人眼判断色彩和细节是否自然。合成测试集上的指标一般用PSNR和SSIM。PSNR衡量像素级重建误差数值越高代表与原图越接近SSIM衡量结构相似性更贴近人的结构感知。这里有个容易被忽略的陷阱合成测试集的参数分布如果和训练集完全一样考的就是记忆力而不是泛化能力模型可能只是记住了训练时的t和A模式。有参考价值的实验应当让测试时的退化条件与训练分布错开。读论文时把不同退化强度、不同背景光颜色下的指标放在一起对比会比只看一个平均分数更有信息量。4.1 与其他经典方法的对比这篇论文横向对比的方法大致分三类第一类是直方图均衡类方法速度快、不依赖模型但容易过饱和、色彩失真第二类是基于融合的方法通过设计权重图把多张增强候选融合起来效果好一些但权重设计依赖场景第三类是基于暗通道先验的系列方法在大气去雾上表现好放到水下因为暗通道假设失效容易把大片蓝绿色背景误判成雾透射率估计偏高恢复结果偏暗。CNN方法在这类对比中胜出的关键不是网络多复杂而是它通过大量合成数据学到了更贴近真实映射的t估计。手写先验总有特定适用范围数据驱动方法在训练分布覆盖到位的情况下统计上更接近真实函数。但要注意这个优势不是绝对的。如果训练分布没有覆盖某些罕见退化传统先验模型反而因为假设稳定而不会崩得太离谱。这也是为什么论文实验部分总会特意挑一些非典型水下图像来展示目的就是看模型在分布外场景下的表现如何。4.2 局限性与论文没有明说的部分论文方法有一个重要的应用前提整张图像共享同一个全局背景光A。合成数据里这个假设完全成立但真实水下场景中可能出现太阳光斑、多光源、水面波浪折射聚焦等背景光在空间上并不是常量。全局常数A的假设一旦偏离恢复图的色温就会整体漂移。另一个简化是单通道透射率。真实水下光的衰减是波长相关的红光衰减快蓝绿光衰减慢严格来说每个颜色通道都应该有不同的透射率。论文用一个统一的t去反推三通道只能部分拉伸色彩无法彻底纠正由波长选择性衰减导致的偏色。这也是为什么模型在某些原图严重偏蓝的测试图上恢复结果仍会残留一层青蓝色调。后来的很多水下增强工作正是沿着分通道估计透射率加入色彩补偿项同时回归A和t等方向做改进如果你顺着引用顺着往后看会明显感受到这条演进脉络。5. 从论文阅读到复现实操实现细节、踩坑与改动建议读论文和复现论文是两码事。下面这部分是我自己动手实现这个方法时积累的经验希望能帮你少走弯路。5.1 复现时最容易踩的三个坑第一个坑是背景光估计。合成训练时A是采样出来的测试时得从输入图像里估计最常见做法是算暗通道图找最亮像素在原图的位置把那里的RGB值当作A。但暗通道最亮处可能是白色目标物或者阳光直射区并不代表背景光直接取最亮值容易把A估高。稳妥一点的做法是先对暗通道做强高斯平滑再取高百分位亮度对应的原图像素值作为A或者对前0.1%最亮像素做平均。A一旦偏差明显整张图的色温都会带偏这个环节值得多花时间调试。第二个坑是透射率下限。恢复公式里的1/t项在t趋近0时会把噪声放到无限大黑暗区域会出现成片噪点和色块。解决办法是在得到网络输出后做一次clip低于0.1的t强制置0.1或者更高一点置0.2。论文正文对这个细节可能只是一句带过但它确实是实现里绕不过去的必需操作。如果你复现后暗部出现明显噪点先别急着怀疑网络结构检查一下有没有做截断。第三个坑是训练数据分布。A和t的采样范围如果太窄模型在真实场景里会因为输入分布外而失效太宽又会生成大量严重失真的合成图让网络在相互矛盾的样本之间学不出稳定的映射。按我的经验t在0.2到1之间平滑变化起步A的RGB通道在0.4到1之间采样同时让蓝绿色通道略高这样生成的数据分布比较接近真实水下环境。当然这不是铁律具体还是得根据测试集效果反推如果真实图上蓝色残留过重可以加重A的蓝绿偏移如果整体欠曝就调高A的下限。5.2 损失函数验证链路和经验排查复现时建议按以下顺序验证管线是否正确第一步先固定A为合成时的真实值喂给网络的输入图如果合成自干净图就能直接反推这时网络输出t应该接近真实t恢复图J也接近干净图。如果这一步就有问题说明网络训练没有收敛或数据管线有bug。第二步改用暗通道法估计A观察J是否仍然正常。第三步再换到真实水下图像这时效果出现退化是正常的重点看退化方式是否符合论文里描述的形态。排查管线时有一个实用的检查点打印中间产物I合成退化图、t预测图、A估计值、最终J。很多问题一眼就能看出是t预测糊了还是A估计偏离了。比如J整体偏红可能是A的红色通道估低了J边缘出现白边可能是t图过度平滑导致物体轮廓周围t过大。把中间结果可视化出来比盯着loss曲线猜要高效得多。5.3 对原方法可以做哪些实用改动顺着论文思路我后来做过几个简单但有效的改动。第一个是把上采样后的t图和原始输入图叠起来送进一个小型精修网络细化边缘透射率能明显改善前景物体边缘的伪影。第二个是把全局常数A改为空间渐变图通过一个小网络同时回归A和t训练难度确实变大但对非均匀光照的真实水下图效果提升明显。还有一个零成本改动训练时对输入图像做随机色彩抖动相当于扩充背景光的分布范围可以提升真实场景的泛化表现且完全不改变网络结构。5.4 这篇论文适合什么状态的人读总结一下我对这篇论文适用人群的判断。如果你刚接触图像增强方向想理解成像物理模型深度学习这套经典组合的思考方式这篇是很合适的入门深度解析对象它不要求多前沿的网络结构基础但对物理模型的理解有要求建议先把Jaffe-McGlamery模型的推导在纸上过一遍。如果你已经用传统方法做过水下增强想看数据驱动方法怎么融入传统管线这篇也是一个很好的切入点。最后说一句个人体会。读这篇论文最大的收获不是复现了一个水下增强算法而是理解了一个方法论层面的选择在数据和先验都不完美的时候不要试图让模型一口吃掉整个问题把问题拆成几个环节把每个环节交给最适合它的工具反而能获得更稳定、更可解释的结果。这个思路在我后来做其他图像复原任务时也一直受用。如果你正在做水下图像方向建议看完这篇后顺手把透射率可视化出来看看。t图会告诉你模型眼里哪些地方远、哪些地方近也能直观暴露合成数据生成时没考虑到的真实场景结构。能把这个中间产品看明白才算真正把这篇文章读透了。
延伸阅读

更多相关文章

2026/10/14 1:40:40

HLS 业务跨域 CORS 踩坑,不止配置 m3u8 就万事大吉

一、业务配置跨域最常见的误区 很多新手遇到浏览器报跨域报错,第一反应给 M3U8 索引文件加上跨域头,以为问题就此解决。上线之后现象很迷惑:M3U8 请求 200 并且携带 Access‑Control‑Allow‑Origin,但是视频依旧黑屏转圈。 很多…

2026/10/14 1:40:40

嗖嗖移动业务大厅资源拆解:从源码到演示图的三层复现指南

简介:这是一份面向Java学习者与小型业务系统开发者的项目资源,围绕“嗖嗖移动业务大厅”提供完整代码、演示图与配套笔记,解决单独看代码难以上手、缺少业务全貌的问题。压缩包共41个文件,包含17个Java源文件与17个已编译class文件…

2026/10/14 1:35:40

小程序车牌号录入:自定义键盘组件设计与真机踩坑实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 2:50:45

离线安装LEMP环境:用本地YUM源解决内网依赖问题

1. 先想清楚一件事:离线安装到底在装什么做运维的都知道,内网服务器意味着什么:没有外网、没有 YUM 源、没有 PIP 仓库,连个文档都翻不了。前阵子我接手一台完全断网的服务器,要求在上面部署一套 NginxPHPMySQL 环境跑…

2026/10/14 2:50:45

机械臂的一个零件(part4)

尺寸1.绘制草图 (半径为65的半圆和底为150和两边长为200的草图 ) 2..拉伸草图(选择创建一个新的…

2026/10/14 2:45:44

Cap 开源录屏上手:从依赖自检到发出第一条分享链接

Cap 开源录屏上手:从依赖自检到发出第一条分享链接 【免费下载链接】Cap Open source Loom alternative. Beautiful, shareable screen recordings. 项目地址: https://gitcode.com/GitHub_Trending/cap1/Cap 给同事讲一个功能,你得先凑齐三人的日…

2026/10/13 5:19:27

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/13 17:09:18

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/14 2:32:55

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/14 0:00:33

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:33

macOS/iOS高精度计时:mach_absolute_time原理与实战

1. 项目概述:为什么mach_absolute_time是 macOS/iOS 时间测量的“黄金标准”在 macOS 和 iOS 开发中,我见过太多人用CFAbsoluteTimeGetCurrent()或NSDate.timeIntervalSinceReferenceDate做性能打点,结果在高精度场景下被系统时钟跳变、NTP 同…

2026/10/14 0:00:33

SCORM课件演示与测试全解析:从API通信到自动化验证

简介:这是一套遵循SCORM标准的交互式课件演示与测试资源,面向E-Learning课程开发者、LMS平台测试人员及在线教学从业者,用于验证课件在不同学习管理系统中的识别、传递与跟踪能力。压缩包共28个文件,约12.07MB,以swf动…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑