1.背景
早期的图像去雾方法主要基于图像处理技术,如直方图均衡化、对比度增强等。这些方法虽然在一定程度上能够改善图像的视觉效果,但往往无法从根本上解决图像去雾问题。
近年来,随着深度学习技术的快速发展,基于深度学习的图像去雾方法取得了显著的突破。这些方法通过构建深度神经网络模型,从大量有雾图像中学习到去雾的规律,从而实现图像去雾的自动化和智能化。随着计算机视觉和数字图像处理技术的发展,图像去雾技术在实际应用中变得越来越重要。雾霾天气会导致拍摄的图像质量下降,影响视觉效果和后续的图像处理任务。在自动驾驶、远程监控、卫星遥感等领域,图像去雾技术可以有效提高图像的清晰度和可辨识度,从而提升系统的整体性能和可靠性。因此,研究和实现有效的图像去雾算法具有重要的理论和实际意义。
2.基本原理
2.2.1基本概念
图像去雾的基本概念来源于大气散射模型。大气散射模型描述了在有雾环境下,光在大气中传播时受到的吸收和散射现象。根据大气散射模型,图像中的每个像素可以表示为:
I(x) = J(x)t(x) + A(1 - t(x))
其中:I(x) 是观测到的雾天图像;J(x) 是无雾的清晰图像;t(x) 是透射率,表示光在大气中传播的衰减程度;A 是大气光值,代表背景光的强度。图像去雾的目标是从观测到的雾天图像 I(x) 中恢复出无雾的清晰图像 J(x) 。
2.2.2基本策略:
图像去雾算法的基本策略通常包括以下几个步骤:
(1) 估计大气光值 A :
大气光值通常可以通过图像中亮度最高的区域来估计。这些区域往往对应于天空或远处的物体。
(2) 估计透射率t(x):
透射率的估计是图像去雾的核心步骤之一。常用的方法包括基于暗原色先验的方法和基于图像滤波的方法。
暗原色先验 :假设无雾图像中的局部区域大多数像素的最小值非常接近于零。利用这个假设,可以从观测图像中估计透射率。
(3)恢复清晰图像 J(x) :
一旦得到了透射率和大气光值,可以通过逆大气散射模型恢复无雾的清晰图像:
J(x) = frac{I(x) - A}{t(x)} + A
(4)后处理 :
为了进一步提升去雾效果,可以对恢复后的图像进行一些后处理,如对比度增强、边缘保留滤波等。
通过以上步骤,可以有效地去除图像中的雾霾,恢复出清晰的图像。在实际应用中,针对不同的雾天情况,可以选择适当的参数和方法进行优化。
图1 去雾前后对比图
3.源代码
%简单来说,我的大概思路为:
%读取第一张图片----读取图片R分量----高斯滤波得到低频图像----原图减去低频图像得到高频图像----直方图均衡化----对G、B分量进行类似的处理----将处理后的分量进行合并----处理下一张图片直至全部处理完。过程中还涉及到了精度的转换,归一化,傅里叶变换(在频域进行处理)。
clear; % 清除工作区中的所有变量
close all; % 关闭所有图形窗口
% 输入和输出文件夹路径
inputFolder = '输入文件夹路径';
outputFolder = '输出文件夹路径';
% 获取输入文件夹中的所有图像文件
imageFiles = dir(fullfile(inputFolder, '*.jpg'));%列出文件夹内容
% 处理每一张图像
for k = 1:length(imageFiles)
% 读取图像
inputFile = fullfile(inputFolder, imageFiles(k).name);
I = imread(inputFile);
% 处理图像的R分量
R = I(:,:,1); % 提取图像的R分量
[N1,M1] = size(R); % 获取R分量的尺寸
R0 = double(R); % 将R分量转换为double类型
Rlog = log(R0 + 1); % 对R分量进行取对数操作
Rfft2 = fft2(R0); % 对R分量进行二维傅里叶变换
sigma = 150; % 设置高斯滤波函数的标准差
F = zeros(N1, M1); % 初始化高斯滤波函数矩阵
for i = 1:N1
for j = 1:M1
F(i,j) = exp(-((i - N1/2)^2 + (j - M1/2)^2) / (2 * sigma * sigma));
% 生成高斯滤波函数
end
end
F = F ./ sum(F(:)); % 对高斯滤波函数进行归一化
Ffft = fft2(double(F)); % 对高斯滤波函数进行二维傅里叶变换
DR0 = Rfft2 .* Ffft; % 对R分量与高斯滤波函数进行卷积运算
DR = ifft2(DR0); % 对卷积结果进行逆傅里叶变换
DRdouble = double(DR); % 将结果转换为double类型
DRlog = log(DRdouble + 1); % 对结果进行取对数操作
Rr = Rlog - DRlog; % 用原图像减去低通滤波后的图像,得到高频增强的图像
EXPRr = exp(Rr); % 取反对数,得到增强后的图像分量
MIN = min(EXPRr(:)); % 找到增强后图像的最小值
MAX = max(EXPRr(:)); % 找到增强后图像的最大值
EXPRr = (EXPRr - MIN) / (MAX - MIN); % 对增强后的图像进行归一化
EXPRr = adapthisteq(EXPRr); % 对增强后的图像进行对比度自适应直方图均衡化
% 处理图像的G分量
G = I(:,:,2); % 提取图像的G分量
G0 = double(G); % 将G分量转换为double类型
Glog = log(G0 + 1); % 对G分量进行取对数操作
Gfft2 = fft2(G0); % 对G分量进行二维傅里叶变换
for i = 1:N1
for j = 1:M1
F(i,j) = exp(-((i - N1/2)^2 + (j - M1/2)^2) / (2 * sigma * sigma)); % 生成高斯滤波函数
end
end
F = F ./ sum(F(:)); % 对高斯滤波函数进行归一化
Ffft = fft2(double(F)); % 对高斯滤波函数进行二维傅里叶变换
DG0 = Gfft2 .* Ffft; % 对G分量与高斯滤波函数进行卷积运算
DG = ifft2(DG0); % 对卷积结果进行逆傅 里叶变换
DGdouble = double(DG); % 将结果转换为double类型
DGlog = log(DGdouble + 1); % 对结果进行取对数操作
Gg = Glog - DGlog; % 用原图像减去低通滤波后的图像,得到高频增强的图像
EXPGg = exp(Gg); % 取反对数,得到增强后的图像分量
MIN = min(EXPGg(:)); % 找到增强后图像的最小值
MAX = max(EXPGg(:)); % 找到增强后图像的最大值
EXPGg = (EXPGg - MIN) / (MAX - MIN); % 对增强后的图像进行归一化
EXPGg = adapthisteq(EXPGg); % 对增强后的图像进行对比度自适应直方图均衡化
% 处理图像的B分量
B = I(:,:,3); % 提取图像的B分量
B0 = double(B); % 将B分量转换为double类型
Blog = log(B0 + 1); % 对B分量进行取对数操作
Bfft2 = fft2(B0); % 对B分量进行二维傅里叶变换
for i = 1:N1
for j = 1:M1
F(i,j) = exp(-((i - N1/2)^2 + (j - M1/2)^2) / (2 * sigma * sigma)); % 生成高斯滤波函数
end
end
F = F ./ sum(F(:)); % 对高斯滤波函数进行归一化
Ffft = fft2(double(F)); % 对高斯滤波函数进行二维傅里叶变换
DB0 = Bfft2 .* Ffft; % 对B分量与高斯滤波函数进行卷积运算
DB = ifft2(DB0); % 对卷积结果进行逆傅里叶变换
DBdouble = double(DB); % 将结果转换为double类型
DBlog = log(DBdouble + 1); % 对结果进行取对数操作
Bb = Blog - DBlog; % 用原图像减去低通滤波后的图像,得到高频增强的图像
EXPBb = exp(Bb); % 取反对数,得到增强后的图像分量
MIN = min(EXPBb(:)); % 找到增强后图像的最小值
MAX = max(EXPBb(:)); % 找到增强后图像的最大值
EXPBb = (EXPBb - MIN) / (MAX - MIN); % 对增强后的图像进行归一化
EXPBb = adapthisteq(EXPBb); % 对增强后的图像进行对比度自适应直方图均衡化
% 融合增强后的图像R、G、B分量
I0 = zeros(N1, M1, 3);%初始化增强后的图像矩阵
I0(:,:,1) = EXPRr; % 将增强后的R分量合并到输出图像中
I0(:,:,2) = EXPGg; % 将增强后的G分量合并到输出图像中
I0(:,:,3) = EXPBb; % 将增强后的B分量合并到输出图像中
% 保存结果图像
outputFile = fullfile(outputFolder, imageFiles(k).name); % 生成输出文件路径
imwrite(I0, outputFile); % 将结果图像保存到输出文件夹
End
disp('去雾图片生成完毕!');
(显然,我是分别对R、G、B三个分量进行了分别的处理,但由于处理过程相同,这里也可以用一个for循环代替简化程序。)
3.结果分析
图2 对比图a
图3 对比图b
3.1结果分析
原图像经过上述去雾算法处理后效果:
(1)清晰度提升:处理后的图像大幅削弱了雾气的影响,视觉上更加清晰,物体边缘更加锐利,通过高频增强,图像中的细节更加明显,如图2。对于图3,由于本身图片清晰度较差,因此去雾处理后清晰度仅仅改善了一些,但同时也出现了一些噪声。
(2)对比度增强:去雾处理有效减少了因雾气造成的色彩失真,使得图像色彩更加接近真实场景。由于本次实验对得到的高频图像进行了直方图均衡化处理,使得图像的整体对比度提高。增强后的图像各通道的亮度差异更明显,使图像显得更加立体,如图2、图3。
3.2 算法优缺点及改进方法
(1)优点:
①效果显著:算法在去雾和提升图像清晰度方面效果显著,尤其是对于严重雾霾天气下拍摄的图像,如图2、图3。
②细节保留:高频增强和对比度自适应直方图均衡化方法能够有效保留和强化图像中的细节。
③通用性强:该算法适用于各种类型的图像,能够对不同场景的雾霾图像进行有效处理。
(2)缺点 :
①计算复杂度高: 由于算法涉及到傅里叶变换和高斯滤波,计算量较大,处理速度较慢,特别是在处理高分辨率图像时。对于文件夹中的101张图片的处理时间大概为2-3分钟。
②参数设置:高斯滤波的标准差对最终效果有较大影响,需要针对不同图像进行调整,对于图2、图3两种情况下用同样的标准差,处理效果差距较大。
③可能引入噪声:在去雾和增强过程中,可能会引入一些不必要的噪声,特别是在处理低质量图像时,如图3,这种情况下还需要进一步的处理。
3.3 解决方案
这里分别针对以上三种缺点提供改进方案。
①优化算法 :使用更高效的算法,如快速傅里叶变换(FFT)和优化的高斯滤波方法,提高处理速度。
②自动参数调节 :引入自动参数调节机制,根据图像的特点自适应调整高斯滤波参数,提高算法的适应性。
③引入去噪处理 :在去雾和增强步骤后增加去噪处理,如使用非局部均值(NL-Means)或卷积神经网络(CNN)去噪方法,减少处理后的噪声。
简单来说,我的大概思路为:取第一张图片-->>读取图片R分量-->>高斯滤波得到低频图像-->>原图减去低频图像得到高频图像-->>直方图均衡化-->>同理对G、B分量进行处理-->>将处理后的分量进行合并-->>处理下一张图片。过程中还涉及到了精度的转换,归一化,傅里叶变换(在频域进行处理)。
4.参考文献
[1] 数字图像处理(第三版), 冈萨雷斯(Rafael C.Gonzalez),电子工业出版社,2017.
[2]齐卉,孙超,苏通,等.基于MATLAB的图像去雾技术研究[J].江汉大学学报(自然科学版),2020,48(06):84-90.DOI:10.16389/j.cnki.cn42-1737/n.2020.06.012.
[3]姚晶晶,张宏伟.基于MATLAB的图像去雾处理技术[J].科技创新与生产力,2019,(09):78-81.