基于深度学习的图像去雾算法:DCP(暗通道先验)
题目描述
图像去雾旨在从有雾图像中恢复出清晰的无雾图像。DCP(暗通道先验)是一种基于物理模型的传统去雾算法,它通过统计观察发现:在绝大多数无雾图像的局部非天空区域中,至少有一个颜色通道的像素值非常低(接近零)。利用这一先验知识,DCP可以直接估计雾的浓度(透射率)和全局大气光,进而通过大气散射模型复原无雾图像。尽管是传统方法,DCP因其简洁性和有效性成为后续深度学习去雾算法的重要基线。
解题过程
-
大气散射模型理解
有雾图像的形成遵循物理模型:
\(I(x) = J(x)t(x) + A(1-t(x))\)
其中:- \(I(x)\):观测到的有雾图像。
- \(J(x)\):目标清晰图像(待恢复)。
- \(A\):全局大气光(通常为场景中最亮的光源颜色)。
- \(t(x)\):透射率(描述光线到达相机的比例,与雾浓度相关)。
去雾的目标是从 \(I(x)\) 中求解 \(J(x)\),需同时估计 \(A\) 和 \(t(x)\)。
-
暗通道先验的定义
对于无雾图像 \(J\) 的任意局部区域 \(\Omega(x)\),其暗通道 \(J^{dark}(x)\) 定义为:
\(J^{dark}(x) = \min_{y \in \Omega(x)} \left( \min_{c \in \{r,g,b\}} J^c(y) \right) \approx 0\)
其中 \(c\) 表示RGB通道。这一先验基于自然场景的统计规律:局部区域内总存在阴影、彩色物体或暗色物体,导致至少一个通道的像素值极低。 -
透射率估计
- 假设大气光 \(A\) 已知,对大气散射模型两边取最小通道操作:
\(\min_{y \in \Omega(x)} \left( \min_c \frac{I^c(y)}{A^c} \right) = t(x) \cdot \min_{y \in \Omega(x)} \left( \min_c \frac{J^c(y)}{A^c} \right) + (1-t(x))\) - 根据暗通道先验,无雾项 \(\min_{y \in \Omega(x)} \left( \min_c \frac{J^c(y)}{A^c} \right) \approx 0\),因此:
\(t(x) \approx 1 - \min_{y \in \Omega(x)} \left( \min_c \frac{I^c(y)}{A^c} \right)\) - 引入参数 \(\omega\)(通常取0.95)保留少量雾以保持自然感:
\(t(x) = 1 - \omega \min_{y \in \Omega(x)} \left( \min_c \frac{I^c(y)}{A^c} \right)\)
- 假设大气光 \(A\) 已知,对大气散射模型两边取最小通道操作:
-
全局大气光估计
- 从有雾图像中选取最亮的像素作为候选,但需避免选择白色物体(如雾本身)。
- 步骤:
- 取暗通道中最亮的前0.1%像素。
- 在原图 \(I\) 中对应位置找到亮度最高的像素,其RGB值作为 \(A\)。
-
无雾图像复原
将估计的 \(A\) 和 \(t(x)\) 代入大气散射模型,求解 \(J(x)\):
\(J(x) = \frac{I(x) - A}{\max(t(x), t_0)} + A\)
其中 \(t_0\)(如0.1)为防止除零的阈值。 -
优化与问题处理
- 透射率细化:原始透射率估计可能块状不连续,需通过引导滤波(Guided Filter)等边缘保持滤波平滑。
- 天空区域处理:暗通道先验在天空区域失效(天空本身亮),需限制透射率下限避免过度增强。
总结
DCP通过统计先验将病态的去雾问题转化为可解的参数估计,但其依赖手工设计的先验,对复杂场景(如浓雾、天空)适应性有限。后续深度学习方法(如DehazeNet、AOD-Net)通过数据驱动学习更鲁棒的先验,但DCP仍是理解物理模型和先验设计的重要基础。