基于暗通道优先算法的去雾技术
暗通道优先算法(Dark Channel Prior, DCP)是一种广泛应用于图像去雾的算法,由何恺明等人提出。该算法基于一个观察结果:在无雾的自然图像中,局部区域的暗通道(即每个像素在RGB三个通道中的最小值)通常接近于零。
1. 暗通道优先算法的原理
-
暗通道定义:对于一幅图像
,其暗通道 定义为: 其中,
是以像素 为中心的局部区域。 -
大气散射模型:有雾图像
可以表示为: 其中,
是无雾图像, 是全局大气光, 是透射率。
2. 去雾步骤
-
估计全局大气光 ( A ):
- 计算输入图像
的暗通道 。 - 选择
中最亮的像素点,计算这些点在原图像 中的平均值作为全局大气光 。
- 计算输入图像
-
估计透射率 ( t(x) ):
-
使用公式:
其中,
是雾的保留系数,通常取 0.95。
-
-
细化透射率:
- 使用指导性滤波(Guided Filtering)对粗透射率图进行细化。
-
恢复无雾图像
-
使用公式:
并限制透射率
的下限值 以保留一定的雾。
-
3. MATLAB代码
基于MATLAB的暗通道优先算法的实现代码:
function J = dehaze(I)
% 输入:有雾图像 I
% 输出:去雾后的图像 J
% 参数设置
w = 0.95; % 雾的保留系数
t0 = 0.1; % 透射率下限值
patchSize = 15; % 暗通道计算的窗口大小
% 转换为双精度格式
I = im2double(I);
% 计算暗通道
I_dark = min(I, [], 3);
I_dark = imfilter(I_dark, fspecial('average', patchSize), 'replicate');
% 估计全局大气光 A
[~, idx] = max(I_dark(:));
[row, col, ~] = ind2sub(size(I_dark), idx);
A = mean(I(row, col, :));
% 估计透射率 t
t = 1 - w * I_dark / A;
t = max(t, t0);
% 细化透射率
t = guidedFilter(I, t, patchSize, 1e-4);
% 恢复无雾图像 J
J = zeros(size(I));
for c = 1:3
J(:, :, c) = (I(:, :, c) - A(c) * (1 - t)) ./ t;
end
% 限制像素值范围
J = max(min(J, 1), 0);
end
参考代码 基于暗通道优先算法去雾 youwenfan.com/contentcsc/83839.html
4. 实验结果
通过上述代码,可以对有雾图像进行去雾处理,恢复出清晰的无雾图像。实验结果表明,暗通道优先算法能够有效地去除图像中的雾气,增强图像的清晰度和对比度。
5. 改进方法
为了提高去雾效果和计算效率,研究人员提出了多种改进方法,例如:
- 中值暗通道优先(MDCP):通过迭代最大类间差法(Otsu算法)锁定近似理想的天空区域,计算全局大气光。
- 多分辨率处理:对图像进行多分辨率处理,减少计算量。
- 结合偏振信息:融合偏振与多光谱信息,提高去雾效果。
通过这些改进方法,暗通道优先算法在处理复杂场景和高分辨率图像时的性能得到了进一步提升。