基于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计算大气散射模型中的传播率实现图像去雾

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架构和物理约束,可进一步提升复杂场景下的去雾性能,为自动驾驶、遥感等领域提供更鲁棒的视觉解决方案。

posted @ 2025-09-11 17:46  kang_ms  阅读(17)  评论(0)    收藏  举报