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 本章知识体系总览

下面这张图,把第一章的核心脉络画出来了。你可以把它当作整个课程的导航图:

图像去雾知识体系总览 图像去雾知识体系总览 图像去雾 雾霾图像退化模型 大气光 A 透射率 t(x) 场景辐射 J(x) 去雾算法分类 基于物理模型 基于深度学习 暗通道先验 颜色衰减先验 滤波优化 端到端网络 GAN 方法 Transformer 课程核心目标 掌握物理模型与深度学习两类去雾方法,并能根据场景选择最优方案 Python 实现 工程落地 效果评估

1.5 课程目标与学习路径

这门课不是纯理论课,也不是纯调包课。我的目标是:让你学完就能动手写代码,并且知道为什么这么写。

具体来说,学完这门课,你应该能做到:

  1. 理解核心原理——能用自己的话讲清楚大气散射模型和暗通道先验。
  2. 手写经典算法——用 Python + OpenCV 实现 DCP、颜色衰减先验等物理模型方法。
  3. 搭建深度学习模型——用 PyTorch 训练一个简单的去雾网络,并调优。
  4. 评估与对比——会用 PSNR、SSIM 等指标量化效果,也能肉眼判断好坏。
  5. 工程化落地——能处理真实场景中的噪声、光照不均、天空区域等棘手问题。

学习建议: 我建议你每章都跟着代码跑一遍,别只看不练。代码我会放在 GitHub 上,你 clone 下来,改改参数,看看效果变化。踩坑才是最好的学习方式——我当年就是这么过来的。