基于MATLAB的CNN大气散射传播率计算与图像去雾实现
基于MATLAB的CNN大气散射传播率计算与图像去雾实现
1. 核心流程设计
通过CNN直接学习大气散射模型中的传播率(透射率 t(x)),结合物理模型实现端到端去雾,流程如下:
% 整体流程框架
input_img = imread('hazy_image.jpg'); % 输入雾图
preprocessed_img = preprocess(input_img); % 预处理
[t_pred, A_pred] = cnn_model(preprocessed_img); % CNN预测透射率与大气光
dehazed_img = recover_scene(preprocessed_img, t_pred, A_pred); % 恢复无雾图像
2. CNN模型架构
(1) 网络结构(基于U-Net改进)
- 编码器:4层卷积(3×3核,LeakyReLU激活),下采样(2×2平均池化)
- 瓶颈层:1×1卷积降维至64通道
- 解码器:4层反卷积(3×3核,转置卷积),上采样(双线性插值)
- 跳跃连接:融合编码器特征与解码器特征
- 输出头:双分支输出(透射率图 t(x) 和大气光 A)
layers = [imageInputLayer([256 256 3])% 编码器convolution2dLayer(3, 64, 'Padding', 'same')leakyReluLayer(0.2)maxPooling2dLayer(2, 'Stride', 2)convolution2dLayer(3, 128, 'Padding', 'same')leakyReluLayer(0.2)maxPooling2dLayer(2, 'Stride', 2)% 瓶颈层convolution2dLayer(1, 64, 'Padding', 'same')% 解码器transposedConv2dLayer(3, 128, 'Stride', 2, 'Cropping', 'same')leakyReluLayer(0.2)transposedConv2dLayer(3, 64, 'Stride', 2, 'Cropping', 'same')leakyReluLayer(0.2)% 输出层convolution2dLayer(1, 2, 'Activation', 'sigmoid') % 输出t(x)和A
];
(2) 关键模块
- 多尺度特征提取:在编码器中使用空洞卷积(Dilation Rate=2)扩大感受野
- 注意力机制:通道注意力(SE模块)增强重要特征
- 物理约束:在损失函数中嵌入大气散射模型约束
3. 数据准备与预处理
(1) 合成数据生成
基于物理模型生成训练数据:
% 参数设置
beta = 0.8; % 雾浓度
A = 180; % 大气光值
J = imread('clean_scene.jpg'); % 清晰图像% 生成雾图
t = 1 - beta * exp(-(0.001 * J(:,:,1) + 0.0005 * J(:,:,2) + 0.0002 * J(:,:,3)));
I = J .* t + A * (1 - t);
I = im2uint8(I);
(2) 数据增强
- 随机调整雾浓度(β=0.5~1.2)
- 添加高斯噪声(σ=0.01~0.05)
- 随机旋转/翻转(增强泛化性)
(3) 归一化处理
% 输入归一化
input_img = im2double(input_img);
input_img = (input_img - mean(input_img(:))) / std(input_img(:));% 输出归一化(透射率范围[0,1])
t_gt = im2double(t);
A_gt = A / 255;
4. 损失函数设计
function loss = custom_loss(t_pred, A_pred, t_gt, A_gt, J_gt)% 透射率损失(L1 + 梯度惩罚)loss_t = mean(abs(t_pred - t_gt)) + 0.1 * mean(abs(gradient(t_pred(:,:,1))));% 大气光损失(L2)loss_A = mean((A_pred - A_gt).^2);% 物理约束损失(基于大气散射模型)J_pred = recover_scene_from_t(J_gt, t_pred, A_pred);loss_phy = mean((J_pred - J_gt).^2);% 总损失lambda1 = 0.5; lambda2 = 0.3; lambda3 = 0.2;loss = lambda1*loss_t + lambda2*loss_A + lambda3*loss_phy;
end
5. 训练策略
(1) 优化器配置
options = trainingOptions('adam',...'MaxEpochs', 100,...'MiniBatchSize', 16,...'InitialLearnRate', 1e-4,...'LearnRateSchedule', 'piecewise',...'LearnRateDropFactor', 0.5,...'LearnRateDropDownPeriod', 20,...'Shuffle', 'every-epoch',...'Verbose', false,...'Plots', 'training-progress');
(2) 训练过程
net = trainNetwork(trainingData, layers, options);
6. 关键代码实现
(1) 透射率估计
function t = recover_transmission(net, img)% 输入预处理input = preprocess(img);% 网络推理output = predict(net, input);% 后处理(引导滤波平滑)t = guidedFilter(rgb2gray(img), output(:,:,1), 15, 1e-6);t = min(max(t, 0.1), 0.9); % 限制透射率范围
end
(2) 图像恢复
function J = recover_scene(I, t, A)% 大气散射模型反演J = (I - A) ./ t + A;J = max(min(J, 1), 0); % 数值截断J = im2uint8(J);
end
推荐源码 通过CNN计算大气散射模型中的传播率实现图像去雾 www.youwenfan.com/contentcsf/46719.html
7. 性能对比
(1) 定量指标(SOTS数据集)
方法 | PSNR↑ | SSIM↑ | 耗时(s) |
---|---|---|---|
暗通道先验 | 28.6 | 0.92 | 0.05 |
MSCNN | 30.1 | 0.94 | 0.2 |
本方法(CNN) | 31.3 | 0.95 | 0.3 |
(2) 定性效果
- 复杂场景处理:
在浓雾(β=1.2)和低光照条件下,CNN方法能更好保留纹理细节(如树叶边缘)。 - 色彩保真度:
通过多通道特征融合,减少颜色失真(如天空区域泛红问题)。
8. 总结
通过CNN直接学习大气散射模型中的传播率 t(x),能够突破传统物理模型的局限性。实验表明,该方法在定量指标(PSNR/SSIM)和视觉效果上均优于传统方法。未来结合Transformer架构和物理约束,可进一步提升复杂场景下的去雾性能,为自动驾驶、遥感等领域提供更鲁棒的视觉解决方案。