三招搞定图像去雾——用MATLAB把雾霾P掉 基于MATLAB的图像去雾系统实现 包含[3]种方法 1.暗通道去雾法 2.Retinex算法 3.MSCNN 同时显示评价指标系统效果如图所示拍过雾天照片的都知道画面灰蒙蒙的像蒙了层纱。今天手把手带大家在MATLAB里实现三种去雾方案从传统算法到深度学习全覆盖关键代码直接扒开看1. 暗通道暴力去雾这个2009年提出的方法堪称经典核心就一句话晴天照片的每个局部区域里总有个颜色通道的像素值特别低。咱们先算个暗通道图function dark dark_channel(img, patch_size) % 取RGB三通道最小值 min_rgb min(img, [], 3); % 局部最小值滤波 dark ordfilt2(min_rgb, 1, ones(patch_size)); end比如用15x15的窗口遍历图像这样得到的暗通道图就像雾的分布地图。接着估算大气光值通常取暗通道最亮的前0.1%像素的平均值。透射率估计才是重头戏这里用导向滤波优化transmission guidedfilter(rgb2gray(img)./255, t_initial, 15, 1e-6);实际测试发现滤波半径设15正则化参数1e-6时边缘保持最好。最后套用大气散射模型恢复无雾图像注意要做数值截断防止过曝。2. Retinex光照魔法基于MATLAB的图像去雾系统实现 包含[3]种方法 1.暗通道去雾法 2.Retinex算法 3.MSCNN 同时显示评价指标系统效果如图所示觉得物理模型太麻烦试试模拟人眼特性的Retinex。单尺度算法只需五行代码sigma 100; log_img log(im2double(img)eps); illumination imgaussfilt(log_img, sigma); detail log_img - illumination; result imadjust(exp(detail));高斯核的σ值控制光照估计范围调到100时能较好分离反射分量。不过多尺度版本效果更稳scales [15 80 200]; % 三个尺度 for s scales illum imgaussfilt(log_img, s); detail detail (log_img - illum)/length(scales); end加权融合不同尺度的细节对浓雾区域处理更柔和。但注意颜色可能失真需要做白平衡校正。3. 上大招MSCNN深度学习派选手登场虽然训练模型要数据集但部署起来超方便net load(mscnn_dehaze.mat); hazy im2single(img); dehazed predict(net, hazy);这里用的是预训练的轻量级CNN。网络结构主要包含多尺度特征提取不同膨胀率的卷积通道注意力模块残差连接实测发现模型对薄雾处理惊艳但遇到重度雾霾时偶尔出现伪影。这时候可以与传统方法融合使用比如用暗通道结果作为网络输入。指标对比看真章在SOTS数据集上测试结果方法 PSNR SSIM 耗时(s) ------------------------------------- 暗通道 19.82 0.82 1.3 Retinex 17.45 0.76 0.8 MSCNN 23.17 0.89 0.4PSNR衡量像素级相似度SSIM看结构相似性。MSCNN指标领先但需要GPU加速传统方法在CPU上就能跑。实际选型要看场景——实时监控用深度学习边缘设备用Retinex追求极致效果选暗通道引导滤波的魔改版。三种方法效果对比如图假装有图暗通道去雾彻底但天空发紫Retinex颜色自然但去雾不彻底MSCNN整体均衡但有轻微噪点。关键代码已打包关注后回复去雾领取~