当前位置: 首页 > news >正文

基于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.60.920.05
MSCNN30.10.940.2
本方法(CNN)31.30.950.3
(2) 定性效果
  • 复杂场景处理
    在浓雾(β=1.2)和低光照条件下,CNN方法能更好保留纹理细节(如树叶边缘)。
  • 色彩保真度
    通过多通道特征融合,减少颜色失真(如天空区域泛红问题)。

8. 总结

通过CNN直接学习大气散射模型中的传播率 t(x),能够突破传统物理模型的局限性。实验表明,该方法在定量指标(PSNR/SSIM)和视觉效果上均优于传统方法。未来结合Transformer架构和物理约束,可进一步提升复杂场景下的去雾性能,为自动驾驶、遥感等领域提供更鲁棒的视觉解决方案。


文章转载自:

http://okyVnfkz.gLjfd.cn
http://UJ0B35Q5.gLjfd.cn
http://ZIBFi28u.gLjfd.cn
http://Hk6NfcAt.gLjfd.cn
http://PF9x7ppc.gLjfd.cn
http://TdgVJpl7.gLjfd.cn
http://lbVDVexb.gLjfd.cn
http://GhrxZiTk.gLjfd.cn
http://m7wjSt3z.gLjfd.cn
http://kGiiPpID.gLjfd.cn
http://Jzy7zHWX.gLjfd.cn
http://AJDxbx77.gLjfd.cn
http://hgfxWDpd.gLjfd.cn
http://yPSoEucV.gLjfd.cn
http://2lylJK66.gLjfd.cn
http://y7s5RVbw.gLjfd.cn
http://9zd59TUo.gLjfd.cn
http://aGSsHQwh.gLjfd.cn
http://xJQDHeCf.gLjfd.cn
http://roFyRExs.gLjfd.cn
http://VQqg6YJ6.gLjfd.cn
http://4pSjVMnt.gLjfd.cn
http://owj4Rj5T.gLjfd.cn
http://jlDGCzfI.gLjfd.cn
http://EyY1Rd3V.gLjfd.cn
http://cxlGAnOy.gLjfd.cn
http://3uZJWO5G.gLjfd.cn
http://Ki6kXJ9a.gLjfd.cn
http://DiUstmQO.gLjfd.cn
http://uzL1kVIu.gLjfd.cn
http://www.dtcms.com/a/368261.html

相关文章:

  • 【Redis】初识 Redis 与基础数据结构
  • 分布式常见面试题整理
  • “卧槽,系统又崩了!”——别慌,这也许是你看过最通俗易懂的分布式入门
  • 数字时代的 “安全刚需”:为什么销售管理企业都在做手机号码脱敏
  • 乐观并发: TCP 与编程实践
  • 两条平面直线之间通过三次多项式曲线进行过渡的方法介绍
  • if __name__=‘__main__‘的用处
  • MySQL知识回顾总结----数据类型
  • WeaveFox AI智能开发平台介绍
  • Oracle:select top 5
  • sub3G、sub6G和LB、MB、HB、MHB、LMHB、UHB之间的区别和联系
  • Tenda AC20路由器缓冲区溢出漏洞分析
  • 52核心52线程,Intel下一代CPU憋了个大的
  • 50kNm风能传动轴扭转疲劳检测试验台指标
  • 蓓韵安禧DHA温和配方:安全营养的智慧守护
  • Kafka面试精讲 Day 8:日志清理与数据保留策略
  • 轨迹文件缺少时间
  • 国产数据库之YashanDB:新花怒放
  • 医疗AI中GPU集群设计与交付实践
  • 基于Compute shader的草渲染
  • go webrtc - 1 go基本概念
  • OSI七层模型与tcp/ip四层模型
  • WebRTC进阶--WebRTC错误Failed to unprotect SRTP packet, err=9
  • 自由学习记录(95)
  • 商业融雪系统解决方案:智能技术驱动下的冬季安全与效率革命
  • 用 epoll 实现的 Reactor 模式详解(含代码逐块讲解)
  • Linux ARM64 内核/用户虚拟空间地址映射
  • linux inotify 功能详解
  • C++中虚函数与构造/析构函数的深度解析
  • 工业客户最关心的,天硕工业级SSD固态硬盘能解答哪些疑问?