第一章 课程导论与雾天成像模型
各位同学好,我是你们这门课的主讲。在计算机视觉领域摸爬滚打了十几年,说实话,图像去雾这个方向我一直觉得特别有意思。你想想看,一张雾蒙蒙的照片,人眼都看不清,却要让算法把背后的景物还原出来——这本身就是件挺酷的事。
我个人最早接触去雾,是在一个安防监控项目里。客户要求雾天也能看清车牌,当时试了好几种方法都不理想。后来才明白,不懂物理模型直接上算法,就是瞎蒙。所以今天咱们先把地基打牢。
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 知识体系总览
下面这张图概括了本章的核心逻辑。我建议你把它存下来,后续每学一个新算法,都回来对照一下它在模型中的位置。
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 我的工作流习惯
最后分享一个我个人的工作流习惯:
- 分步调试:不要一次性写完整个算法。每写一个模块,立刻用测试图验证中间结果。
- 可视化中间结果:透射率图、大气光估计、去雾中间态——全部显示出来。肉眼看到问题,比看数字快得多。
- 版本管理:用 Git 或 MATLAB 自带的 Projects 功能。我吃过亏——改了一版代码,效果变差了,但回不去了。
好了,第一章的内容就到这里。模型、公式、环境,这三样东西是后续所有算法的基础。别急着往下赶,先把大气散射模型刻在脑子里——你后面会发现,所有去雾算法,本质上都是在回答同一个问题:t(x) 和 A 怎么估?