图像去雾是计算机视觉里非常基础却又实用的任务。当摄像头在雾、霾、烟尘等恶劣天气下工作时,入射光被悬浮颗粒散射,导致成像模糊、颜色发白。恢复出清晰图像不仅提升观感,更为自动驾驶、视频监控、遥感解译提供可靠输入。本文从原理、实现与选型三个层面,比较经典的暗通道先验算法与近年流行的深度学习去雾方案。

暗通道先验的理论与实现
暗通道先验由何恺明在2009年提出,核心观察是:在绝大多数无雾户外图像的局部 patch 中,总存在某个颜色通道的像素亮度极低,趋近于零。数学上定义为对图像 J 在每个点 x 的邻域 Ω(x) 取最小操作后,再跨通道取最小,得到的结果图称为暗通道。有雾图像模型遵循 I(x)=J(x)t(x)+A(1-t(x)),其中 A 是全局大气光,t 是透射率。由于无雾图暗通道接近0,可推导出粗透射率估计,再用软抠图细化,最后恢复 J。
该方法的优势在于完全无监督,不需要任何训练数据,且对均匀薄雾非常鲁棒。但它依赖强统计假设,遇到天空、水面等本身明亮区域,暗通道不再趋零,容易产生颜色偏差。此外软抠图计算代价高,后续出现导向滤波替代以提速。下面给出基于 OpenCV 的简化暗通道计算示例:
import cv2
import numpy as np
def dark_channel(img, size=15):
# img 为三通道浮点图,范围0-1
min_ch = np.min(img, axis=2)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (size, size))
dark = cv2.erode(min_ch, kernel)
return dark
img = cv2.imread('hazy.jpg') / 255.0
d = dark_channel(img, 15)
print(d.mean())
上述代码用形态学腐蚀模拟局部最小值,是暗通道最直观的实现。实际完整去雾还要估计大气光 A 与透射率 t,并做白场裁剪防止过饱和。在工程落地时,很多嵌入式设备直接采用导向滤波版暗通道,能在几十毫秒内处理一帧720P图像,非常适合算力受限场景。
深度学习去雾模型的架构与训练
深度学习方法把去雾看作端到端映射。早期如 DehazeNet 用多层卷积预测透射率,再结合大气模型复原;后来像 AOD-Net 把模型改写为直接输出清晰图,简化流程;近年的 GridDehazeNet、FFA-Net 引入注意力机制强化特征选择;还有基于 CycleGAN 的无成对数据方案,利用清晰与雾图集合做循环一致约束。这类模型通常在一个大型合成雾数据集(如 RESIDE)上训练,学习从有雾到无雾的非线性变换。
训练时损失函数常由重建误差(L1/L2)、感知损失与对抗损失组合。感知损失借助预训练 VGG 提取特征,使复原图在高层语义上更接近真值,避免仅追求像素级相似导致的模糊。下面给出一个极简的 PyTorch 风格网络片段,用于说明端到端去雾的前向逻辑:
import torch
import torch.nn as nn
class SimpleDehaze(nn.Module):
def __init__(self):
super().__init__()
self.enc = nn.Conv2d(3, 32, 3, padding=1)
self.dec = nn.Conv2d(32, 3, 3, padding=1)
self.relu = nn.ReLU()
def forward(self, x):
# x 为有雾图 batch
f = self.relu(self.enc(x))
out = self.dec(f)
return torch.clamp(out, 0, 1)
model = SimpleDehaze()
hazy = torch.rand(1, 3, 256, 256)
clean = model(hazy)
print(clean.shape)
虽然示例网络非常简单,但真实模型会叠加多级残差与通道注意力。深度方法的短板同样明显:模型需要大量成对或循环数据,浓雾下合成数据与实际物理成像存在域差,导致泛化下降;同时网络推理需要 GPU 资源,难以直接塞进低端摄像头。因此在选择时要评估业务能否接受云端调用延迟。
工程选型与混合策略建议
面对具体项目,先明确约束条件。若系统为路边抓拍机,芯片仅有 CPU 且要求毫秒级响应,暗通道先验配合导向滤波几乎是唯一可行路径。它不依赖模型仓库,代码量少,维护成本低。如果业务处于云端视频增强平台,每日处理百万张图且雾情复杂,训练好的深度模型能提供更自然的色彩与细节,长期来看人力投入更划算。
还有一种被低估的思路是混合架构:用暗通道快速算出透射率初值,将其作为额外通道送入轻量网络做细化。这样网络只需学习残差补偿,训练难度下降,也能缓解纯数据驱动在天空区域的崩坏。下表从几个维度对比两种路线:
| 维度 | 暗通道先验 | 深度学习 |
|---|---|---|
| 数据需求 | 无 | 大量成对或循环数据 |
| 算力占用 | 低,CPU可跑 | 高,常需GPU |
| 浓雾表现 | 易偏色 | 细节更好 |
| 可解释性 | 强,基于物理模型 | 弱,黑盒映射 |
综合来看,没有绝对优劣,只有适配与否。建议团队在原型期同时跑通两套基线,用相同测试集算 PSNR 与主观打分,再结合部署环境算总拥有成本。理解暗通道与深度模型的差异,才能避免盲目追新或固守旧法,让图像去雾真正服务于业务目标。
image_dehazingdark_channel_priordeep_learning修改时间:2026-08-14 07:21:30