第一章 课程导论与雾天成像模型

各位同学好,我是你们这门课的主讲。在计算机视觉领域摸爬滚打了十几年,说实话,图像去雾这个方向我一直觉得特别有意思。你想想看,一张雾蒙蒙的照片,人眼都看不清,却要让算法把背后的景物还原出来——这本身就是件挺酷的事。

我个人最早接触去雾,是在一个安防监控项目里。客户要求雾天也能看清车牌,当时试了好几种方法都不理想。后来才明白,不懂物理模型直接上算法,就是瞎蒙。所以今天咱们先把地基打牢。

1.1 图像去雾的意义

图像去雾,说白了就是消除雾气对成像的干扰,恢复出清晰的场景。它的应用场景比你想象的广得多:

  • 安防监控:雾天看不清人脸、车牌,去雾后才有证据价值
  • 自动驾驶:摄像头被雾遮挡,感知系统直接失效
  • 遥感影像:卫星图被雾霾覆盖,地物判读全凭运气
  • 摄影后期:旅游照片拍糊了?去雾能救回不少

我在项目中遇到过最典型的案例:某港口监控系统,每年11月到次年2月几乎天天有雾。没做去雾前,回放录像全是白茫茫一片。后来加了去雾模块,识别率从30%直接跳到85%。这就是去雾的价值——不是锦上添花,是雪中送炭。

核心认知:去雾不是"让图片变好看",而是"恢复被大气散射破坏的物理信息"。这个认知决定了你后续所有算法的设计思路。

1.2 雾天成像物理模型

要理解去雾,必须先理解雾是怎么让图像变模糊的。这里有一个经典模型——大气散射模型(Atmospheric Scattering Model)。

模型公式很简单:

I(x) = J(x) * t(x) + A * (1 - t(x))

其中:

  • I(x):你拍到的雾图(已知)
  • J(x):无雾时的清晰场景(我们要恢复的)
  • t(x):透射率,表示光线穿过雾的能力(0~1之间)
  • A:大气光值,可以理解为雾的颜色和亮度

这个公式怎么理解?我习惯把它拆成两项:

第一项 J(x) * t(x) 是场景本身的衰减——雾越浓,t(x)越小,场景越暗。第二项 A * (1 - t(x)) 是雾的叠加——雾越浓,这一项越大,图像越白。

嗯,这里要注意:t(x) 和 A 都是未知的。一个方程,三个未知数,这就是去雾问题的病态性所在。说白了,你不可能直接解,必须引入先验知识或假设。

我的经验:刚开始学去雾时,我总想找到"精确解"。后来才明白,工程问题里"足够好的近似"比"理论上精确但算不出来"有用得多。暗通道先验、颜色衰减先验,本质上都是在给这个病态问题加约束。

1.3 透射率与景深的关系

透射率 t(x) 和景深 d(x) 之间有一个指数关系:

t(x) = e^(-β * d(x))

β 是大气散射系数,雾越浓 β 越大。这个公式告诉我们:

  • 近处的物体,d(x) 小,t(x) 接近 1,几乎不受雾影响
  • 远处的物体,d(x) 大,t(x) 接近 0,完全被雾覆盖

我曾经犯过一个错误:在去雾时对所有像素用同样的参数处理。结果近处过曝,远处还是糊的。后来才意识到,透射率是空间变化的,必须逐像素估计。

景深范围 透射率 t(x) 图像表现 去雾难度
0~10米 0.9~1.0 几乎清晰 低
10~50米 0.5~0.9 轻微雾感 中
50~200米 0.1~0.5 明显模糊 高
200米以上 0~0.1 几乎不可见 极高

1.4 大气光值的物理含义

大气光 A 很多人理解成"图像中最亮的像素",其实不准确。它应该是无穷远处雾的颜色。在均匀雾天,你可以把 A 近似为天空区域的平均颜色。

我踩过的一个坑:直接用图像中亮度最高的像素作为 A。结果遇到有白色建筑物或车灯的场景,A 被严重高估,去雾后图像偏暗偏色。后来改用暗通道方法选 A,才稳定下来。

避坑指南:大气光 A 的估计直接影响去雾效果。A 偏大 → 去雾过度 → 图像偏暗;A 偏小 → 去雾不足 → 残留雾气。我曾经在一个项目中调了三天参数,最后发现是 A 的采样区域选错了。

1.5 知识体系总览

下面这张图概括了本章的核心逻辑。我建议你把它存下来,后续每学一个新算法,都回来对照一下它在模型中的位置。

雾天成像模型与去雾知识体系 雾图 I(x) 已知:拍摄图像 未知:J(x), t(x), A I(x) = J(x)·t(x) + A·(1 - t(x)) 估计透射率 t(x) 估计大气光 A 恢复清晰图 J(x) 先验知识:暗通道先验 / 颜色衰减先验 / 深度学习 去雾的本质:从 I(x) 出发,借助先验知识估计 t(x) 和 A,最终恢复 J(x)

1.6 MATLAB环境配置与基础操作

工欲善其事,必先利其器。咱们这门课全程用 MATLAB 做仿真,先把环境搭好。

1.6.1 版本选择

我个人建议用 R2020b 及以上版本。太老的版本缺少一些图像处理工具箱的新函数,比如 imreducehaze 是 R2017b 才加入的。如果你用的是 R2016a 之前的版本,有些代码跑不了。

MATLAB版本 推荐度 说明
R2020b 及以上 ★★★★★ 功能完整,推荐使用
R2017b ~ R2020a ★★★★ 基本可用,部分新函数缺失
R2016a 及以下 ★★ 需要手动安装工具箱,不推荐

1.6.2 必备工具箱

去雾算法主要依赖以下工具箱:

  • Image Processing Toolbox:图像读写、滤波、形态学操作
  • Computer Vision Toolbox:特征提取、图像增强(可选)
  • Signal Processing Toolbox:部分算法需要频域处理

检查工具箱是否安装,在命令行输入 ver 就能看到列表。缺哪个就去 MathWorks 官网下载。

小技巧:如果你用的是学校或公司的正版授权,可以直接在 MATLAB 的 Add-On Explorer 里搜索安装,比手动下载方便得多。

1.6.3 第一个去雾Demo

装好环境后,咱们跑一个最简单的去雾示例,验证环境是否正常:

% 读取雾图
img = imread('foggy_road.jpg');

% 使用MATLAB内置去雾函数
dehazed = imreducehaze(img);

% 显示对比
figure;
subplot(1,2,1); imshow(img); title('雾图');
subplot(1,2,2); imshow(dehazed); title('去雾后');

% 保存结果
imwrite(dehazed, 'dehazed_result.jpg');

这段代码只有5行,但背后调用了完整的暗通道先验算法。如果你能跑通,说明环境没问题。如果报错,检查一下 imreducehaze 是否存在——这个函数是 R2017b 才加入的。

注意:imreducehaze 是 MATLAB 内置的"黑盒"函数,效果还行但不可控。咱们这门课后面会手写完整的去雾算法,从底层实现每一个步骤。到那时候,你才能真正理解去雾的每一个细节。

1.6.4 我的工作流习惯

最后分享一个我个人的工作流习惯:

  1. 分步调试:不要一次性写完整个算法。每写一个模块,立刻用测试图验证中间结果。
  2. 可视化中间结果:透射率图、大气光估计、去雾中间态——全部显示出来。肉眼看到问题,比看数字快得多。
  3. 版本管理:用 Git 或 MATLAB 自带的 Projects 功能。我吃过亏——改了一版代码,效果变差了,但回不去了。

好了,第一章的内容就到这里。模型、公式、环境,这三样东西是后续所有算法的基础。别急着往下赶,先把大气散射模型刻在脑子里——你后面会发现,所有去雾算法,本质上都是在回答同一个问题:t(x) 和 A 怎么估?