基于 MATLAB 的双边滤波去图像云雾处理
基于 MATLAB 的双边滤波去图像云雾处理可以通过结合暗通道先验和滤波透射来实现。
实现步骤
-
暗通道先验估计
利用暗通道先验理论估计雾霾浓度。暗通道先验指出,在大多数不包含天空的局部区域内,至少存在一个颜色通道的像素值接近于零。 -
估计透射率
通过暗通道先验估计透射率图。透射率公式为:\(t(x) = 1 - \omega \cdot \min_{y \in \Omega(x)} \left( \min_{c \in \{r,g,b\}} \frac{I^c(y)}{A^c} \right)\)
其中,\(\omega\) 是一个控制去雾程度的参数,通常取值为 0.95。
-
双边滤波优化透射率
使用双边滤波对透射率图进行平滑处理,以减少块效应并保留边缘信息。 -
恢复清晰图像
使用估计的透射率和大气光值恢复清晰图像:\(J(x) = \frac{I(x) - A}{\max(t(x), t_0)} + A\)
其中,\(t_0\) 是一个最小透射率阈值,用于避免除零问题。
代码
function dehazed_image = dehaze(image, omega, t0)
% 输入:
% image - 有雾图像
% omega - 控制去雾程度的参数,默认为 0.95
% t0 - 最小透射率阈值,默认为 0.1
% 输出:
% dehazed_image - 去雾后的图像
% 转换为双精度
image = double(image) / 255;
% 1. 估计暗通道
dark_channel = min(image, [], 3); % 暗通道
dark_channel = imfilter(dark_channel, fspecial('average', [15, 15]), 'replicate');
% 2. 估计大气光
[~, idx] = max(dark_channel(:));
[rows, cols, ~] = size(image);
[r, c] = ind2sub([rows, cols], idx);
atmospheric_light = image(r, c, :);
% 3. 估计透射率
normalized_image = image ./ atmospheric_light;
dark_channel = min(normalized_image, [], 3);
dark_channel = imfilter(dark_channel, fspecial('average', [15, 15]), 'replicate');
transmission = 1 - omega * dark_channel;
% 4. 双边滤波优化透射率
transmission = bfilter2(transmission, 3, 0.1); % 双边滤波
% 5. 恢复清晰图像
dehazed_image = zeros(size(image));
for i = 1:3
dehazed_image(:, :, i) = (image(:, :, i) - atmospheric_light(i)) ./ max(transmission, t0) + atmospheric_light(i);
end
% 转换回 uint8
dehazed_image = uint8(255 * dehazed_image);
end
% 辅助函数:双边滤波
function output = bfilter2(input, sigma_s, sigma_r)
% 双边滤波
output = imguidedfilter(input, 'NeighborhoodSize', 3, 'DegreeOfSmoothing', sigma_r);
end
使用
% 读取有雾图像
image = imread('foggy_image.jpg');
% 调用去雾函数
dehazed_image = dehaze(image, 0.95, 0.1);
% 显示结果
figure;
subplot(1, 2, 1);
imshow(image);
title('有雾图像');
subplot(1, 2, 2);
imshow(dehazed_image);
title('去雾后图像');
参考代码 基于matlab双边滤波去图像云雾处理,通过暗通道处理和滤波透射来实现 youwenfan.com/contentcnb/97833.html。
这种方法结合了暗通道先验和双边滤波的优势,能够在去除雾霾的同时保留图像的细节和边缘信息。

浙公网安备 33010602011771号