1. 图像去雾概述:雾霾图像退化模型、去雾算法分类与课程目标
大家好,欢迎来到《图像去雾与光照校正算法实战》的第一章。
说实话,我第一次接触图像去雾,是在一个安防监控项目里。客户拍回来的视频,雾蒙蒙一片,人脸都看不清。那时候我就在想,这玩意儿到底能不能靠算法救回来?后来我发现,不仅能,而且方法还挺多。
这一章,我们先不急着写代码。先把雾霾是怎么让图像变质的搞清楚,再把市面上主流的去雾路子捋一遍。嗯,打好地基,后面盖楼才稳。
1.1 雾霾图像退化模型:一张照片是怎么被雾“毁掉”的?
你想想看,一张清晰的照片,光线从物体表面反射,一路跑到相机传感器里。但雾霾天就不一样了,空气中飘着大量悬浮颗粒——水滴、尘埃、烟尘。光线撞上这些颗粒,一部分被散射掉,一部分被吸收掉。结果就是:
- 对比度下降——画面发灰,像蒙了一层纱
- 颜色偏移——整体偏白偏蓝,饱和度降低
- 细节丢失——远处的纹理完全糊掉
学术界把这种现象总结成一个经典模型,叫大气散射模型。公式长这样:
I(x) = J(x) * t(x) + A * (1 - t(x))
别被符号吓到,我拆开给你讲:
| 符号 | 含义 | 通俗理解 |
|---|---|---|
I(x) |
观测到的雾图 | 你拍到的模糊照片 |
J(x) |
无雾的清晰图像 | 我们想恢复的目标 |
t(x) |
透射率(0~1) | 光线穿过雾的能力,越远越小 |
A |
大气光值 | 天空或远处最亮区域的亮度 |
这个模型告诉我们一件事:去雾的本质,就是从 I(x) 反推 J(x)。但问题来了——我们只有一个方程,却有 J(x)、t(x)、A 三个未知数。这就是典型的“病态问题”。
核心洞察: 所有去雾算法,本质上都是在想办法给这个病态问题加约束条件。谁加的约束更合理,谁的效果就更好。
1.2 去雾算法分类:两条完全不同的路
我个人习惯把去雾算法分成两大类。一条路靠物理模型硬算,另一条路靠数据喂出来的神经网络。各有各的脾气。
1.2.1 基于物理模型的方法
这类方法的核心思路是:既然我们知道雾是怎么形成的,那就反过来推。先估计出大气光 A 和透射率 t(x),然后代入模型反解出 J(x)。
经典代表有:
- 暗通道先验(DCP)——何恺明老师的成名作。他发现无雾图像的局部区域里,总有一个通道的像素值特别低。利用这个先验,就能算出透射率。
- 颜色衰减先验——利用雾图在 HSV 空间的亮度-饱和度关系来估计深度。
- 基于滤波的方法——比如引导滤波、双边滤波,用来细化透射率图,避免出现光晕。
我的经验: 暗通道先验在大多数户外场景效果不错,但遇到天空、白色物体、雪地这些“本来就亮”的区域,容易翻车。我曾经在一个雪景项目里被坑过,暗通道直接失效,天空变成一块块暗斑。后来加了天空分割才解决。
1.2.2 基于深度学习的方法
这条路更“暴力”——直接拿大量成对的雾图/清晰图去训练一个神经网络,让模型自己学会映射关系。
主流方向包括:
- 端到端去雾网络——输入雾图,直接输出清晰图。代表有 DehazeNet、AOD-Net。
- 基于生成对抗网络(GAN)——用生成器去雾,用判别器判断结果是否真实。比如 GCANet。
- 基于 Transformer 的方法——最近两年兴起,利用自注意力机制捕捉全局依赖,效果更细腻。
避坑指南: 我曾经用公开数据集训练了一个端到端模型,在测试集上 PSNR 高得离谱。结果一放到真实监控画面上,直接崩了——颜色偏紫,边缘还有伪影。为什么?因为公开数据集大多是合成雾,真实雾的分布更复杂。所以,别迷信公开指标,一定要在真实场景上验证。
1.3 两类方法的对比
我把它们的差异整理成一张表,方便你对照:
| 对比维度 | 基于物理模型 | 基于深度学习 |
|---|---|---|
| 理论基础 | 大气散射模型 | 数据驱动的映射学习 |
| 是否需要训练数据 | 不需要 | 需要大量成对数据 |
| 计算速度 | 快(毫秒级) | 依赖硬件(GPU 秒级) |
| 泛化能力 | 场景受限(天空、白墙易失效) | 依赖训练数据分布 |
| 效果上限 | 中等,易出现光晕/颜色失真 | 高,细节恢复更自然 |
| 可解释性 | 强,每一步都有物理含义 | 弱,黑盒模型 |
说白了,物理模型像老中医——靠经验方子,稳定但上限有限。深度学习像西医——靠大量数据做诊断,效果好但需要“对症下药”。
1.4 本章知识体系总览
下面这张图,把第一章的核心脉络画出来了。你可以把它当作整个课程的导航图:
1.5 课程目标与学习路径
这门课不是纯理论课,也不是纯调包课。我的目标是:让你学完就能动手写代码,并且知道为什么这么写。
具体来说,学完这门课,你应该能做到:
- 理解核心原理——能用自己的话讲清楚大气散射模型和暗通道先验。
- 手写经典算法——用 Python + OpenCV 实现 DCP、颜色衰减先验等物理模型方法。
- 搭建深度学习模型——用 PyTorch 训练一个简单的去雾网络,并调优。
- 评估与对比——会用 PSNR、SSIM 等指标量化效果,也能肉眼判断好坏。
- 工程化落地——能处理真实场景中的噪声、光照不均、天空区域等棘手问题。
学习建议: 我建议你每章都跟着代码跑一遍,别只看不练。代码我会放在 GitHub 上,你 clone 下来,改改参数,看看效果变化。踩坑才是最好的学习方式——我当年就是这么过来的。