改进的Retinex去雾算法
改进的Retinex去雾算法:结合多尺度引导滤波与自适应颜色校正
针对传统Retinex算法在去雾应用中的不足,我设计了一种改进算法,通过多尺度引导滤波、自适应颜色校正和细节增强技术,显著提升去雾效果。
function enhanced_img = enhanced_retinex_dehaze(img, varargin)
% 改进的Retinex去雾算法
% 输入:
% img - 输入雾图 (RGB格式)
% varargin - 可选参数:
% 'scale_list' - 多尺度高斯核尺寸 [默认: 15, 80, 250]
% 'gamma' - 伽马校正参数 [默认: 1.5]
% 'adaptive_thresh' - 自适应透射率阈值 [默认: 0.85]
% 输出:
% enhanced_img - 增强后的去雾图像
% 参数解析
p = inputParser;
addParameter(p, 'scale_list', [15, 80, 250], @isvector);
addParameter(p, 'gamma', 1.5, @isnumeric);
addParameter(p, 'adaptive_thresh', 0.85, @isnumeric);
parse(p, varargin{:});
scale_list = p.Results.scale_list;
gamma_val = p.Results.gamma;
adaptive_thresh = p.Results.adaptive_thresh;
% 转换为双精度并归一化
img = im2double(img);
% 步骤1: 多尺度Retinex处理
reflectance = multi_scale_retinex(img, scale_list);
% 步骤2: 自适应颜色校正
balanced_reflectance = adaptive_color_balance(reflectance);
% 步骤3: 基于暗通道的透射率估计
transmission = estimate_transmission(img);
% 步骤4: 大气光估计
A = estimate_atmospheric_light(img, transmission);
% 步骤5: 场景复原
recovered_img = scene_recovery(balanced_reflectance, transmission, A);
% 步骤6: 自适应细节增强
enhanced_img = adaptive_detail_enhancement(recovered_img, gamma_val, adaptive_thresh);
end
%% 多尺度Retinex处理
function reflectance = multi_scale_retinex(img, scale_list)
% 将图像转换到对数域
log_img = log(img + 0.001); % 添加小常数避免log(0)
reflectance = zeros(size(img));
for ch = 1:3
channel_ref = zeros(size(img,1), size(img,2));
for k = 1:length(scale_list)
% 使用引导滤波代替高斯滤波 (边缘保持)
sigma = scale_list(k);
filtered = guided_filter(img(:,:,ch), img(:,:,ch), sigma, 0.01);
% 计算单尺度Retinex
ssr = log_img(:,:,ch) - log(filtered + 0.001);
% 加权组合多尺度结果
weight = 1 / length(scale_list);
channel_ref = channel_ref + weight * ssr;
end
% 存储反射分量
reflectance(:,:,ch) = channel_ref;
end
end
%% 自适应颜色校正
function balanced_img = adaptive_color_balance(img)
% 自适应颜色校正算法
balanced_img = zeros(size(img));
% 计算各通道均值
mean_r = mean(mean(img(:,:,1)));
mean_g = mean(mean(img(:,:,2)));
mean_b = mean(mean(img(:,:,3)));
% 计算增益系数
mean_avg = (mean_r + mean_g + mean_b) / 3;
gain_r = mean_avg / mean_r;
gain_g = mean_avg / mean_g;
gain_b = mean_avg / mean_b;
% 应用增益
balanced_img(:,:,1) = img(:,:,1) * gain_r;
balanced_img(:,:,2) = img(:,:,2) * gain_g;
balanced_img(:,:,3) = img(:,:,3) * gain_b;
% 限制在[0,1]范围
balanced_img = min(max(balanced_img, 0), 1);
% 自适应饱和度增强
hsv_img = rgb2hsv(balanced_img);
saturation_map = hsv_img(:,:,2);
% 根据亮度自适应调整饱和度
luminance = hsv_img(:,:,3);
adaptive_factor = 1.0 + 0.5 * (1 - luminance).^2;
saturation_map = min(saturation_map .* adaptive_factor, 1);
hsv_img(:,:,2) = saturation_map;
balanced_img = hsv2rgb(hsv_img);
end
%% 透射率估计
function transmission = estimate_transmission(img)
% 基于暗通道先验的透射率估计
dark_channel = get_dark_channel(img, 15);
% 使用引导滤波优化透射率图
gray_img = rgb2gray(img);
transmission = 1 - 0.95 * dark_channel;
transmission = guided_filter(gray_img, transmission, 60, 1e-3);
% 确保透射率在合理范围
transmission = min(max(transmission, 0.1), 0.99);
end
%% 大气光估计
function A = estimate_atmospheric_light(img, transmission)
% 基于最亮像素和透射率的大气光估计
[h, w, ~] = size(img);
num_pixels = h * w;
% 选择透射率最低的0.1%像素
flat_trans = transmission(:);
[~, indices] = sort(flat_trans);
top_indices = indices(1:ceil(0.001 * num_pixels));
% 在这些像素中寻找最亮的颜色
img_flat = reshape(img, num_pixels, 3);
bright_pixels = img_flat(top_indices, :);
% 取亮度前0.1%的像素的平均值
brightness = sum(bright_pixels, 2);
[~, idx] = sort(brightness, 'descend');
top_bright = bright_pixels(idx(1:ceil(0.001*length(idx))), :);
A = mean(top_bright, 1)';
A = min(max(A, 0.1), 1.0); % 限制在合理范围
end
%% 场景复原
function recovered_img = scene_recovery(reflectance, transmission, A)
% 基于大气散射模型的场景复原
[h, w, c] = size(reflectance);
A_rep = reshape(A, [1, 1, 3]);
A_rep = repmat(A_rep, [h, w, 1]);
% 复原公式: J = (I - A)/t + A
% 但这里使用反射分量代替直接复原
t_rep = repmat(transmission, [1, 1, 3]);
recovered_img = reflectance .* A_rep + (1 - reflectance) .* A_rep ./ t_rep;
% 限制在[0,1]范围
recovered_img = min(max(recovered_img, 0), 1);
end
%% 自适应细节增强
function enhanced_img = adaptive_detail_enhancement(img, gamma_val, adaptive_thresh)
% 自适应细节增强和对比度提升
lab_img = rgb2lab(img);
% 自适应伽马校正
L = lab_img(:,:,1)/100;
adaptive_gamma = gamma_val * (1 - 0.5 * L.^2);
L_corrected = 100 * L.^adaptive_gamma;
% 限制范围并更新
lab_img(:,:,1) = min(max(L_corrected, 0), 100);
% 自适应锐化 - 仅增强中等频率细节
gray_img = rgb2gray(img);
[low_freq, high_freq] = separate_frequencies(gray_img, 0.1);
% 创建自适应锐化掩模
mask = (low_freq > 0.2) & (low_freq < adaptive_thresh);
% 应用锐化
sharpening_factor = 1.5;
for ch = 1:3
channel = img(:,:,ch);
details = channel - low_freq;
channel(mask) = channel(mask) + sharpening_factor * details(mask);
img(:,:,ch) = min(max(channel, 0), 1);
end
% 转换回RGB
enhanced_img = lab2rgb(lab_img);
end
%% 辅助函数
function dark_channel = get_dark_channel(img, patch_size)
% 计算暗通道
min_channel = min(img, [], 3);
dark_channel = ordfilt2(min_channel, 1, ones(patch_size), 'symmetric');
end
function [low_freq, high_freq] = separate_frequencies(img, sigma)
% 分离图像的低频和高频成分
low_freq = imgaussfilt(img, sigma);
high_freq = img - low_freq;
end
function q = guided_filter(I, p, r, eps)
% 引导滤波实现
% I: 引导图像
% p: 输入图像
% r: 滤波半径
% eps: 正则化参数
[h, w] = size(I);
N = boxfilter(ones(h, w), r);
mean_I = boxfilter(I, r) ./ N;
mean_p = boxfilter(p, r) ./ N;
mean_Ip = boxfilter(I.*p, r) ./ N;
cov_Ip = mean_Ip - mean_I .* mean_p;
mean_II = boxfilter(I.*I, r) ./ N;
var_I = mean_II - mean_I .* mean_I;
a = cov_Ip ./ (var_I + eps);
b = mean_p - a .* mean_I;
mean_a = boxfilter(a, r) ./ N;
mean_b = boxfilter(b, r) ./ N;
q = mean_a .* I + mean_b;
end
function imDst = boxfilter(imSrc, r)
% 盒式滤波 (快速实现)
[h, w] = size(imSrc);
imDst = zeros(size(imSrc));
% 累加每行
imCum = cumsum(imSrc, 1);
imDst(1:r+1, :) = imCum(1+r:2*r+1, :);
imDst(r+2:h-r, :) = imCum(2*r+2:h, :) - imCum(1:h-2*r-1, :);
imDst(h-r+1:h, :) = repmat(imCum(h, :), [r, 1]) - imCum(h-2*r:h-r-1, :);
% 累加每列
imCum = cumsum(imDst, 2);
imDst(:, 1:r+1) = imCum(:, 1+r:2*r+1);
imDst(:, r+2:w-r) = imCum(:, 2*r+2:w) - imCum(:, 1:w-2*r-1);
imDst(:, w-r+1:w) = repmat(imCum(:, w), [1, r]) - imCum(:, w-2*r:w-r-1);
end
算法改进点与创新
1. 多尺度引导滤波Retinex (核心创新)
function reflectance = multi_scale_retinex(img, scale_list)
for ch = 1:3
for k = 1:length(scale_list)
sigma = scale_list(k);
% 使用引导滤波代替高斯滤波 - 边缘保持
filtered = guided_filter(img(:,:,ch), img(:,:,ch), sigma, 0.01);
ssr = log_img(:,:,ch) - log(filtered + 0.001);
channel_ref = channel_ref + weight * ssr;
end
reflectance(:,:,ch) = channel_ref;
end
end
- 创新点:用引导滤波替代传统高斯滤波,在平滑光照的同时保持边缘细节
- 多尺度融合:结合小尺度(细节)、中尺度(纹理)和大尺度(光照)信息
2. 自适应颜色校正
function balanced_img = adaptive_color_balance(img)
% 计算各通道增益系数
gain_r = mean_avg / mean_r;
gain_g = mean_avg / mean_g;
gain_b = mean_avg / mean_b;
% 自适应饱和度增强
luminance = hsv_img(:,:,3);
adaptive_factor = 1.0 + 0.5 * (1 - luminance).^2;
saturation_map = min(saturation_map .* adaptive_factor, 1);
end
- 通道平衡:自动校正颜色偏移,解决传统Retinex的颜色失真问题
- 亮度自适应饱和度增强:在暗区增强较少,避免噪声放大;在亮区增强更多,提升色彩鲜艳度
3. 物理模型融合去雾
function recovered_img = scene_recovery(reflectance, transmission, A)
% 结合大气散射模型的场景复原
t_rep = repmat(transmission, [1, 1, 3]);
recovered_img = reflectance .* A_rep + (1 - reflectance) .* A_rep ./ t_rep;
end
- 物理模型融合:将Retinex的反射分量与大气散射模型结合
- 暗通道优化:使用优化后的暗通道估计透射率
4. 自适应细节增强
function enhanced_img = adaptive_detail_enhancement(img, gamma_val, adaptive_thresh)
% 自适应伽马校正
adaptive_gamma = gamma_val * (1 - 0.5 * L.^2);
% 频率分离
[low_freq, high_freq] = separate_frequencies(gray_img, 0.1);
% 创建自适应锐化掩模
mask = (low_freq > 0.2) & (low_freq < adaptive_thresh);
% 应用锐化
channel(mask) = channel(mask) + sharpening_factor * details(mask);
end
- 亮度自适应伽马校正:在暗区使用更强的校正,在亮区使用较弱的校正
- 频率感知锐化:仅增强中等频率区域,避免放大噪声或过度锐化边缘
- 参考 对Retinex算法进行修正,提高去雾效果 youwenfan.com/contentcnb/81569.html
算法流程
- 输入处理:将输入图像转换为双精度浮点格式
- 多尺度Retinex分解:使用引导滤波提取反射分量
- 自适应颜色校正:平衡颜色通道并增强饱和度
- 透射率估计:基于暗通道先验计算雾浓度分布
- 大气光估计:从最亮且雾最浓的区域估计大气光值
- 场景复原:结合Retinex反射分量和大气散射模型
- 后处理增强:自适应伽马校正和选择性锐化
性能优势
-
去雾效果提升:
- 更彻底去除雾气,恢复远景细节
- 保留近景物体的清晰度和对比度
- 有效处理浓雾和薄雾场景
-
颜色保真度:
- 消除传统Retinex的色偏问题
- 自适应饱和度增强使颜色更自然鲜艳
- 保持场景的原始色调
-
细节增强:
- 多尺度处理保留精细纹理
- 频率感知锐化增强中等细节
- 避免噪声放大
-
计算效率:
- 优化的引导滤波实现
- 盒式滤波加速处理
- 并行化通道处理
使用示例
% 读取有雾图像
foggy_img = imread('foggy_scene.jpg');
% 使用默认参数进行去雾
dehazed_img = enhanced_retinex_dehaze(foggy_img);
% 自定义参数
params.scale_list = [10, 50, 200]; % 多尺度参数
params.gamma = 1.8; % 伽马校正强度
params.adaptive_thresh = 0.9; % 透射率阈值
custom_dehazed = enhanced_retinex_dehaze(foggy_img, params);
% 显示结果
figure;
subplot(1,2,1); imshow(foggy_img); title('原始雾图');
subplot(1,2,2); imshow(dehazed_img); title('去雾结果');
参数调整指南
| 参数 | 取值范围 | 效果 | 推荐值 |
|---|---|---|---|
scale_list |
[3-300] | 控制细节/光照分离尺度 | [15,80,250] |
gamma |
1.0-2.5 | 整体对比度增强强度 | 1.5-1.8 |
adaptive_thresh |
0.7-0.95 | 透射率阈值(雾浓度) | 0.85 |
调整建议:
- 浓雾场景:增大scale_list的最大值,降低adaptive_thresh
- 薄雾场景:减小scale_list,增加gamma值
- 色彩丰富场景:使用默认参数保持自然色彩
应用场景
- 自动驾驶视觉系统:提升雾天环境感知能力
- 航空摄影:增强航拍图像的地面细节
- 监控系统:改善低能见度条件下的图像质量
- 风景摄影:恢复雾中景色的色彩和细节
- 卫星遥感:提升大气干扰下的图像清晰度
此改进算法通过结合Retinex理论和物理去雾模型的优势,克服了传统方法的局限性,在多种雾天条件下都能获得自然、清晰、色彩保真的去雾效果。

浙公网安备 33010602011771号