Fattal 去雾算法是一类经典的物理模型去雾方法。它从大气散射模型出发,把图像颜色、光照和透射率之间的关系拆开,再利用局部统计假设估计透射率。
📚 参考资料
✍️ 前言
🌫️ 有雾图像的退化模型
单幅图像去雾通常从大气散射模型开始:
eq 1
其中:
-
:相机拍摄到的有雾图像。 -
:场景辐射(Scene Radiance),也就是希望恢复的无雾清晰图像。 -
:透射率(Medium Transmission),描述场景光线到达相机时保留下来的比例。 -
:全局大气光(Global Atmospheric Light)。
如 公式(1) 所示,去雾问题中已知的是
透射率
这里
🧩 基于反照系数分解的 Fattal 去雾算法
该方法来自 Raanan Fattal 的论文 Single Image Dehazing。它的关键想法是把场景辐射
这个分解与 Retinex 理论一致,可以把图像形成过程理解成两个部分:
-
:反射分量(Reflectance)。它代表物体表面的固有属性,比如颜色、纹理、材质和细节,可以理解为物体本身的颜色。 -
:光照分量(Illumination)。它代表照射到场景中的环境光分布,主要影响整体明暗、亮度和对比度,通常变化更平滑。
如果只看一个局部区域
- 在同一小区域内,
可以近似为三维常量 。 -
主要由场景深度和雾的浓度决定, 主要由光照和表面反射性质决定,因此二者在局部区域内可以看作统计无关。
于是有:
协方差定义为:
把
eq 2
🔍 分解反射分量
接下来,将
其中:
-
:与大气光正交的分量。 -
:与大气光平行的分量。 - 二者满足
。
代入 公式(2) 并整理,可以得到:
eq 3
这里引入了两个记号:
🧮 分解观测图像
同样地,把
eq 4
这里用到了两个关系:
将
移项整理后得到透射率表达式:
eq 5
到这里可以看到:如果已经有大气光
🧠 引入
消去
前面用到的关键假设是
把 公式(5) 中的
eq 6
等式两边同时对
其中:
-
,因为常数与任意变量的协方差为 0。 -
,因为这里构造的 与 无关。
🧭
如何取?
由 公式(6) 将
等式两边同除
因此可以令:
这样
🧾 最后求解
整体流程可以概括为:
📌 总结
✅ 优点
| 优点 | 说明 |
|---|---|
| 物理意义明确 | 推导基于大气散射模型,不是单纯的经验增强。颜色线假设在自然场景中有一定统计合理性。 |
| 色彩还原自然 | 相比早期直方图拉伸、对比度增强等方法,颜色线模型更容易保留物体固有颜色,色偏相对较小。 |
| 推导较紧凑 | 通过局部统计关系估计透射率,不需要像部分变分方法那样手动调大量平滑参数。 |
⚠️ 局限
| 局限 | 说明 |
|---|---|
| 缺乏鲁棒的大气光自动估计机制 | 算法本身不擅长自动解耦
|
| 天空和高亮区域容易出问题 | 天空、高亮反射区域不一定满足颜色线假设,去雾后可能出现变暗、断层或颜色异常。 |
| 对噪声和压缩敏感 | JPEG 压缩块、传感器噪声会破坏局部颜色分布,导致协方差估计不稳定。 |
个人理解上,Fattal 方法的价值不在于工程上足够鲁棒,而在于它提供了一个很清晰的视角:去雾不只是增强对比度,而是在估计图像形成过程里的透射率和大气光。
💻 Python 程序
1 | import cv2 |