基于直方图优化(直方图均衡化、自适应直方图均衡化CLAHE)的图像去雾MATLAB仿真程序:
matlab
%% 基于直方图优化的图像去雾技术MATLAB仿真程序
% 功能:实现多种直方图优化算法用于图像去雾增强
clear all; close all; clc;
warning('off', 'all'); % 关闭所有警告
%% 1. 读取和预处理雾天图像
% 检查是否有雾天图像,如果没有则读取内置图像
disp('=== 基于直方图优化的图像去雾技术 ===');
% 尝试读取用户图像,如果没有则使用内置示例
try
[filename, pathname] = uigetfile({'*.jpg;*.png;*.bmp;*.tif', '图像文件 (*.jpg, *.png, *.bmp, *.tif)'}, '选择雾天图像');
if isequal(filename, 0)
error('用户取消选择');
end
img_path = fullfile(pathname, filename);
foggy_img = imread(img_path);
fprintf('成功读取图像: %s\n', filename);
catch
% 使用内置雾天图像
fprintf('使用内置雾天图像示例...\n');
foggy_img = imread('foggy_scene.jpg');
if isempty(foggy_img)
% 如果没有内置图像,创建一个模拟雾天图像
fprintf('生成模拟雾天图像...\n');
clear_img = im2double(imread('peppers.png'));
% 为清晰图像添加雾效果
foggy_img = add_fog_effect(clear_img, 0.6);
end
end
% 转换为双精度浮点数用于处理
if isinteger(foggy_img)
foggy_img = im2double(foggy_img);
end
% 如果图像是灰度图,转换为彩色处理
if size(foggy_img, 3) == 1
foggy_img = cat(3, foggy_img, foggy_img, foggy_img);
fprintf('灰度图像已转换为伪彩色图像用于处理\n');
end
% 调整图像大小以提高处理速度(保持宽高比)
max_dim = 600;
[h, w, ~] = size(foggy_img);
if h > max_dim || w > max_dim
scale = max_dim / max(h, w);
new_h = round(h * scale);
new_w = round(w * scale);
foggy_img = imresize(foggy_img, [new_h, new_w]);
fprintf('图像已调整大小: %dx%d -> %dx%d\n', h, w, new_h, new_w);
end
[h, w, c] = size(foggy_img);
fprintf('图像尺寸: %d x %d x %d\n', h, w, c);
%% 2. 直方图分析函数
% 计算并显示图像的RGB直方图
function plot_rgb_histogram(img, title_str)
figure('Position', [100, 100, 1000, 400]);
subplot(1, 2, 1);
imshow(img);
title(['图像: ', title_str], 'FontSize', 12);
subplot(1, 2, 2);
hold on;
% 计算各通道直方图
colors = {'r', 'g', 'b'};
for i = 1:3
channel = img(:,:,i);
[counts, bins] = imhist(channel, 256);
plot(bins, counts, colors{i}, 'LineWidth', 1.5);
end
xlabel('像素强度');
ylabel('频率');
title(['RGB直方图: ', title_str]);
legend('Red通道', 'Green通道', 'Blue通道', 'Location', 'best');
grid on;
hold off;
end
% 计算图像的统计特征
function stats = compute_image_stats(img)
stats.mean = mean(img(:));
stats.std = std(img(:));
stats.min = min(img(:));
stats.max = max(img(:));
stats.entropy = entropy(img);
% 计算对比度(局部标准差均值)
window_size = 3;
local_std = stdfilt(rgb2gray(img), ones(window_size));
stats.contrast = mean(local_std(:));
% 计算亮度
gray_img = rgb2gray(img);
stats.brightness = mean(gray_img(:));
end
% 显示统计信息
function display_stats(stats, name)
fprintf('\n%s 图像统计:\n', name);
fprintf(' 均值: %.4f\n', stats.mean);
fprintf(' 标准差: %.4f\n', stats.std);
fprintf(' 最小值: %.4f\n', stats.min);
fprintf(' 最大值: %.4f\n', stats.max);
fprintf(' 熵: %.4f\n', stats.entropy);
fprintf(' 对比度: %.4f\n', stats.contrast);
fprintf(' 亮度: %.4f\n', stats.brightness);
end
%% 3. 标准直方图均衡化去雾方法
function enhanced_img = histeq_dehaze(foggy_img)
% 分别对每个通道进行直方图均衡化
enhanced_img = zeros(size(foggy_img));
for i = 1:3
channel = foggy_img(:,:,i);
% 应用直方图均衡化
enhanced_channel = histeq(channel);
enhanced_img(:,:,i) = enhanced_channel;
end
% 限制输出范围在[0, 1]
enhanced_img = min(max(enhanced_img, 0), 1);
end
%% 4. 自适应直方图均衡化(CLAHE)去雾方法
function enhanced_img = clahe_dehaze(foggy_img, clip_limit, tile_size)
% 设置默认参数
if nargin < 2
clip_limit = 0.01; % 对比度限制阈值
end
if nargin < 3
tile_size = [8, 8]; % 分块大小
end
enhanced_img = zeros(size(foggy_img));
% 分别对每个通道应用CLAHE
for i = 1:3
channel = foggy_img(:,:,i);
% 应用CLAHE
enhanced_channel = adapthisteq(channel, ...
'ClipLimit', clip_limit, ...
'NumTiles', tile_size, ...
'Distribution', 'uniform');
enhanced_img(:,:,i) = enhanced_channel;
end
end
%% 5. 带色彩恢复的CLAHE方法
function enhanced_img = clahe_color_recovery(foggy_img, clip_limit, tile_size)
% 转换到LAB颜色空间以更好地保持色彩
lab_img = rgb2lab(foggy_img);
% 分离L通道(亮度)
L = lab_img(:,:,1) / 100; % 归一化到[0,1]
% 对L通道应用CLAHE
L_enhanced = adapthisteq(L, ...
'ClipLimit', clip_limit, ...
'NumTiles', tile_size, ...
'Distribution', 'uniform');
% 恢复L通道到原始范围
L_enhanced = L_enhanced * 100;
% 合并通道
enhanced_lab = lab_img;
enhanced_lab(:,:,1) = L_enhanced;
% 转换回RGB空间
enhanced_img = lab2rgb(enhanced_lab);
end
%% 6. 多尺度Retinex增强与直方图优化结合
function enhanced_img = msr_histeq_dehaze(foggy_img)
% 多尺度Retinex增强
scales = [15, 80, 250]; % 多尺度参数
msr_img = zeros(size(foggy_img));
for ch = 1:3
channel = foggy_img(:,:,ch);
retinex_ch = single_scale_retinex(channel, scales(1));
for s = 2:length(scales)
retinex_ch = retinex_ch + single_scale_retinex(channel, scales(s));
end
msr_img(:,:,ch) = retinex_ch / length(scales);
end
% 对Retinex结果进行直方图均衡化
enhanced_img = histeq_dehaze(msr_img);
end
% 单尺度Retinex函数
function retinex_img = single_scale_retinex(img, sigma)
% 高斯滤波
h = fspecial('gaussian', max(1, fix(6*sigma)), sigma);
low_pass = imfilter(img, h, 'replicate');
% 避免对数运算中的零值
low_pass(low_pass == 0) = 1e-10;
% Retinex计算
retinex_img = log(img + 1e-10) - log(low_pass);
% 归一化
retinex_img = (retinex_img - min(retinex_img(:))) / ...
(max(retinex_img(:)) - min(retinex_img(:)));
end
%% 7. 基于暗通道先验的直方图优化去雾
function enhanced_img = dcp_histeq_dehaze(foggy_img, omega, guided_filter)
% 基于暗通道先验的去雾,然后进行直方图优化
% 参数:omega - 去雾程度参数 (0<omega<=1)
% guided_filter - 是否使用引导滤波
if nargin < 2
omega = 0.95; % 默认去雾程度
end
if nargin < 3
guided_filter = true;
end
% 转换到双精度
img = im2double(foggy_img);
% 1. 估计大气光值
% 计算暗通道
patch_size = 15;
dark_channel = compute_dark_channel(img, patch_size);
% 选取最亮的0.1%像素
num_pixels = numel(dark_channel);
[~, indices] = sort(dark_channel(:), 'descend');
atmospheric_light = zeros(1, 3);
for i = 1:3
channel = img(:,:,i);
atmospheric_light(i) = max(channel(indices(1:ceil(num_pixels*0.001))));
end
% 2. 估计透射率图
% 归一化图像
normalized_img = zeros(size(img));
for i = 1:3
normalized_img(:,:,i) = img(:,:,i) ./ atmospheric_light(i);
end
% 计算归一化图像的暗通道
normalized_dark = compute_dark_channel(normalized_img, patch_size);
% 估计透射率
transmission = 1 - omega * normalized_dark;
% 使用引导滤波优化透射率
if guided_filter
transmission = guided_filter_color(img, transmission, 40, 1e-3);
end
% 限制透射率范围
transmission = max(min(transmission, 1), 0.1);
% 3. 恢复无雾图像
recovered_img = zeros(size(img));
for i = 1:3
recovered_img(:,:,i) = (img(:,:,i) - atmospheric_light(i)) ./ ...
max(transmission, 0.1) + atmospheric_light(i);
end
% 4. 对恢复的图像进行直方图优化
enhanced_img = clahe_color_recovery(recovered_img);
% 限制输出范围
enhanced_img = min(max(enhanced_img, 0), 1);
end
% 计算暗通道
function dark_channel = compute_dark_channel(img, patch_size)
[h, w, ~] = size(img);
pad_size = floor(patch_size/2);
% 填充图像边界
padded_img = padarray(img, [pad_size, pad_size], 'replicate');
% 计算暗通道
dark_channel = zeros(h, w);
for i = 1:h
for j = 1:w
patch = padded_img(i:i+patch_size-1, j:j+patch_size-1, :);
dark_channel(i,j) = min(patch(:));
end
end
end
% 引导滤波
function q = guided_filter_color(I, p, r, eps)
% I: 引导图像 (彩色)
% p: 输入图像 (灰度)
% r: 窗口半径
% eps: 正则化参数
[hei, wid] = size(p);
N = boxfilter(ones(hei, wid), r); % 窗口内像素数
mean_I_r = boxfilter(I(:,:,1), r) ./ N;
mean_I_g = boxfilter(I(:,:,2), r) ./ N;
mean_I_b = boxfilter(I(:,:,3), r) ./ N;
mean_p = boxfilter(p, r) ./ N;
mean_Ip_r = boxfilter(I(:,:,1).*p, r) ./ N;
mean_Ip_g = boxfilter(I(:,:,2).*p, r) ./ N;
mean_Ip_b = boxfilter(I(:,:,3).*p, r) ./ N;
% 协方差
cov_Ip_r = mean_Ip_r - mean_I_r .* mean_p;
cov_Ip_g = mean_Ip_g - mean_I_g .* mean_p;
cov_Ip_b = mean_Ip_b - mean_I_b .* mean_p;
% 引导图像的方差
var_I_rr = boxfilter(I(:,:,1).*I(:,:,1), r) ./ N - mean_I_r .* mean_I_r;
var_I_rg = boxfilter(I(:,:,1).*I(:,:,2), r) ./ N - mean_I_r .* mean_I_g;
var_I_rb = boxfilter(I(:,:,1).*I(:,:,3), r) ./ N - mean_I_r .* mean_I_b;
var_I_gg = boxfilter(I(:,:,2).*I(:,:,2), r) ./ N - mean_I_g .* mean_I_g;
var_I_gb = boxfilter(I(:,:,2).*I(:,:,3), r) ./ N - mean_I_g .* mean_I_b;
var_I_bb = boxfilter(I(:,:,3).*I(:,:,3), r) ./ N - mean_I_b .* mean_I_b;
a = zeros(hei, wid, 3);
for y = 1:hei
for x = 1:wid
Sigma = [var_I_rr(y,x), var_I_rg(y,x), var_I_rb(y,x);
var_I_rg(y,x), var_I_gg(y,x), var_I_gb(y,x);
var_I_rb(y,x), var_I_gb(y,x), var_I_bb(y,x)];
cov_Ip = [cov_Ip_r(y,x); cov_Ip_g(y,x); cov_Ip_b(y,x)];
a(y,x,:) = (Sigma + eps * eye(3)) \ cov_Ip;
end
end
b = mean_p - a(:,:,1) .* mean_I_r - a(:,:,2) .* mean_I_g - a(:,:,3) .* mean_I_b;
q = (boxfilter(a(:,:,1), r) .* I(:,:,1) + ...
boxfilter(a(:,:,2), r) .* I(:,:,2) + ...
boxfilter(a(:,:,3), r) .* I(:,:,3) + boxfilter(b, r)) ./ N;
end
% 盒式滤波
function imDst = boxfilter(imSrc, r)
[hei, wid] = size(imSrc);
imDst = zeros(size(imSrc));
% 垂直方向累积
imCum = cumsum(imSrc, 1);
% 计算差异
imDst(1:r+1, :) = imCum(1+r:2*r+1, :);
imDst(r+2:hei-r, :) = imCum(2*r+2:hei, :) - imCum(1:hei-2*r-1, :);
imDst(hei-r+1:hei, :) = repmat(imCum(hei, :), [r, 1]) - imCum(hei-2*r:hei-r-1, :);
% 水平方向累积
imCum = cumsum(imDst, 2);
% 计算差异
imDst(:, 1:r+1) = imCum(:, 1+r:2*r+1);
imDst(:, r+2:wid-r) = imCum(:, 2*r+2:wid) - imCum(:, 1:wid-2*r-1);
imDst(:, wid-r+1:wid) = repmat(imCum(:, wid), [1, r]) - imCum(:, wid-2*r:wid-r-1);
end
%% 8. 评估函数
function metrics = evaluate_dehazing(original_img, enhanced_img)
% 计算图像质量评估指标
% 转换为灰度图像用于计算部分指标
orig_gray = rgb2gray(original_img);
enh_gray = rgb2gray(enhanced_img);
metrics = struct();
% 1. 对比度改进比 (CIR)
orig_contrast = std(orig_gray(:));
enh_contrast = std(enh_gray(:));
metrics.CIR = enh_contrast / orig_contrast;
% 2. 信息熵 (反映图像信息量)
orig_entropy = entropy(orig_gray);
enh_entropy = entropy(enh_gray);
metrics.Entropy = enh_entropy;
metrics.EntropyImprovement = enh_entropy - orig_entropy;
% 3. 平均梯度 (反映图像清晰度)
[Gx_orig, Gy_orig] = gradient(double(orig_gray));
[Gx_enh, Gy_enh] = gradient(double(enh_gray));
orig_grad = sqrt(Gx_orig.^2 + Gy_orig.^2);
enh_grad = sqrt(Gx_enh.^2 + Gy_enh.^2);
metrics.AvgGradientOrig = mean(orig_grad(:));
metrics.AvgGradientEnh = mean(enh_grad(:));
metrics.GradientImprovement = metrics.AvgGradientEnh / metrics.AvgGradientOrig;
% 4. 亮度保持度
orig_brightness = mean(orig_gray(:));
enh_brightness = mean(enh_gray(:));
metrics.BrightnessPreservation = 1 - abs(enh_brightness - orig_brightness) / orig_brightness;
% 5. 结构相似性指数 (SSIM)
metrics.SSIM = ssim(enh_gray, orig_gray);
% 6. 自然图像质量评估 (NIQE) - 需要单独的函数
try
metrics.NIQE = niqe(enh_gray);
catch
metrics.NIQE = NaN;
end
end
%% 9. 添加雾效函数(用于测试)
function foggy_img = add_fog_effect(clear_img, fog_density)
% 为清晰图像添加雾效果
% fog_density: 0 (无雾) 到 1 (浓雾)
% 估计大气光值(假设为图像中最亮的像素)
atmospheric_light = max(clear_img(:));
% 创建深度图(假设简单的线性深度)
[h, w, ~] = size(clear_img);
[X, Y] = meshgrid(1:w, 1:h);
center_x = w/2;
center_y = h/2;
% 基于距离中心的距离创建深度图
depth = sqrt((X - center_x).^2 + (Y - center_y).^2);
depth = depth / max(depth(:)); % 归一化到[0,1]
% 添加雾效果
foggy_img = zeros(size(clear_img));
beta = 1.5 * fog_density; % 散射系数
for i = 1:3
channel = clear_img(:,:,i);
transmission = exp(-beta * depth);
foggy_img(:,:,i) = channel .* transmission + atmospheric_light * (1 - transmission);
end
% 确保在[0,1]范围内
foggy_img = min(max(foggy_img, 0), 1);
end
%% 10. 主程序执行
% 分析原始雾天图像
fprintf('\n=== 原始雾天图像分析 ===\n');
orig_stats = compute_image_stats(foggy_img);
display_stats(orig_stats, '原始雾天');
plot_rgb_histogram(foggy_img, '原始雾天图像');
% 等待用户查看
pause(1);
%% 应用不同的直方图优化去雾方法
methods = {
'标准直方图均衡化', @histeq_dehaze;
'自适应直方图均衡化(CLAHE)', @()clahe_dehaze(foggy_img, 0.02, [8, 8]);
'CLAHE色彩恢复(LAB空间)', @()clahe_color_recovery(foggy_img, 0.02, [8, 8]);
'多尺度Retinex+直方图均衡化', @msr_histeq_dehaze;
'暗通道先验+CLAHE优化', @()dcp_histeq_dehaze(foggy_img, 0.95, true);
};
% 存储结果
results = cell(length(methods), 3); % 名称, 图像, 评估指标
fprintf('\n=== 开始图像去雾处理 ===\n');
for i = 1:length(methods)
method_name = methods{i, 1};
method_func = methods{i, 2};
fprintf('处理中: %s...', method_name);
try
% 应用去雾方法
tic;
enhanced_img = method_func();
processing_time = toc;
% 确保图像在[0,1]范围内
enhanced_img = min(max(enhanced_img, 0), 1);
% 评估结果
metrics = evaluate_dehazing(foggy_img, enhanced_img);
% 存储结果
results{i, 1} = method_name;
results{i, 2} = enhanced_img;
results{i, 3} = metrics;
results{i, 4} = processing_time;
fprintf('完成 (耗时: %.2f秒)\n', processing_time);
% 显示中间结果
if i <= 3 % 只显示前3个方法的中间结果
figure('Position', [100+200*(i-1), 100, 400, 600]);
subplot(3, 1, 1);
imshow(foggy_img);
title('原始雾天图像', 'FontSize', 10);
subplot(3, 1, 2);
imshow(enhanced_img);
title(sprintf('%s去雾结果', method_name), 'FontSize', 10);
subplot(3, 1, 3);
hold on;
colors = {'r', 'g', 'b'};
for ch = 1:3
[counts, bins] = imhist(enhanced_img(:,:,ch), 256);
plot(bins, counts, colors{ch}, 'LineWidth', 1);
end
xlabel('像素强度');
ylabel('频率');
title(sprintf('%s直方图', method_name), 'FontSize', 10);
legend('Red', 'Green', 'Blue', 'Location', 'best');
grid on;
end
catch ME
fprintf('错误: %s\n', ME.message);
continue;
end
end
%% 11. 综合比较与评估
fprintf('\n=== 去雾方法性能评估 ===\n');
% 创建评估表格
fprintf('\n%-35s %10s %10s %10s %10s %10s\n', ...
'方法', 'CIR', '熵改进', '梯度改进', '亮度保持', 'SSIM');
fprintf('%s\n', repmat('-', 1, 85));
for i = 1:size(results, 1)
if isempty(results{i, 1})
continue;
end
metrics = results{i, 3};
fprintf('%-35s %10.3f %10.3f %10.3f %10.3f %10.3f\n', ...
results{i, 1}, ...
metrics.CIR, ...
metrics.EntropyImprovement, ...
metrics.GradientImprovement, ...
metrics.BrightnessPreservation, ...
metrics.SSIM);
end
%% 12. 可视化所有结果
fprintf('\n=== 生成综合比较图 ===\n');
% 创建综合比较图
figure('Position', [50, 50, 1400, 900]);
% 原始图像
subplot(3, 3, 1);
imshow(foggy_img);
title('原始雾天图像', 'FontSize', 11, 'FontWeight', 'bold');
% 显示所有去雾结果
for i = 1:min(8, length(methods))
if i+1 > 9, break; end % 防止超出子图数量
subplot(3, 3, i+1);
if i <= size(results, 1) && ~isempty(results{i, 2})
imshow(results{i, 2});
method_name = results{i, 1};
% 缩短长名称
if length(method_name) > 20
method_name = [method_name(1:18), '...'];
end
title(sprintf('%s\nCIR:%.2f, 熵:%.3f', ...
method_name, results{i, 3}.CIR, results{i, 3}.Entropy), ...
'FontSize', 9);
else
text(0.5, 0.5, '处理失败', ...
'HorizontalAlignment', 'center', 'FontSize', 12);
axis off;
end
end
% 添加总标题
sgtitle('基于直方图优化的图像去雾方法比较', 'FontSize', 14, 'FontWeight', 'bold');
%% 13. 直方图比较图
figure('Position', [100, 100, 1200, 800]);
% 原始图像直方图
subplot(3, 3, 1);
hold on;
colors = {'r', 'g', 'b'};
for ch = 1:3
[counts, bins] = imhist(foggy_img(:,:,ch), 256);
plot(bins, counts, colors{ch}, 'LineWidth', 1);
end
title('原始雾天图像直方图', 'FontSize', 10);
xlabel('强度值');
ylabel('频率');
legend('R', 'G', 'B', 'Location', 'best');
grid on;
% 各方法直方图
for i = 1:min(8, size(results, 1))
if isempty(results{i, 1}), continue; end
subplot(3, 3, i+1);
hold on;
enhanced_img = results{i, 2};
for ch = 1:3
[counts, bins] = imhist(enhanced_img(:,:,ch), 256);
plot(bins, counts, colors{ch}, 'LineWidth', 1);
end
title_str = results{i, 1};
if length(title_str) > 15
title_str = [title_str(1:13), '...'];
end
title(title_str, 'FontSize', 9);
xlabel('强度值');
ylabel('频率');
grid on;
% 添加对比度值
text(0.05, 0.95, sprintf('CIR: %.2f', results{i, 3}.CIR), ...
'Units', 'normalized', 'FontSize', 8, ...
'BackgroundColor', 'white');
end
sgtitle('去雾前后直方图分布比较', 'FontSize', 14, 'FontWeight', 'bold');
%% 14. 性能指标雷达图
fprintf('\n=== 生成性能指标雷达图 ===\n');
% 选择3个最佳方法进行详细比较
valid_results = {};
for i = 1:size(results, 1)
if ~isempty(results{i, 1})
valid_results{end+1} = results{i, :};
end
end
if length(valid_results) >= 3
% 选择评估指标最好的3个方法
[~, idx] = sort(cellfun(@(x) x{3}.CIR * x{3}.EntropyImprovement, valid_results), 'descend');
top_methods = valid_results(idx(1:min(3, length(idx))));
% 创建雷达图
figure('Position', [150, 150, 800, 600]);
metrics_names = {'CIR', '熵改进', '梯度改进', '亮度保持', 'SSIM'};
num_metrics = length(metrics_names);
% 准备数据
data = zeros(length(top_methods), num_metrics);
for i = 1:length(top_methods)
m = top_methods{i}{3};
data(i, :) = [m.CIR, m.EntropyImprovement*10, m.GradientImprovement, ...
m.BrightnessPreservation, m.SSIM];
end
% 归一化数据到[0,1]范围(用于雷达图显示)
data_norm = data;
for j = 1:num_metrics
col_min = min(data(:, j));
col_max = max(data(:, j));
if col_max > col_min
data_norm(:, j) = (data(:, j) - col_min) / (col_max - col_min);
else
data_norm(:, j) = 0.5;
end
end
% 绘制雷达图
angles = linspace(0, 2*pi, num_metrics+1);
angles = angles(1:end-1);
ax = polaraxes;
hold(ax, 'on');
colors = {'r-', 'g-', 'b-'};
for i = 1:size(data_norm, 1)
values = [data_norm(i, :), data_norm(i, 1)]; % 闭合多边形
polarplot(ax, [angles, angles(1)], values, colors{i}, 'LineWidth', 2);
end
% 设置雷达图属性
ax.ThetaTick = linspace(0, 360, num_metrics+1);
ax.ThetaTickLabel = metrics_names;
ax.RLim = [0, 1];
ax.RTick = 0:0.2:1;
% 添加图例
legend_names = cell(1, length(top_methods));
for i = 1:length(top_methods)
name = top_methods{i}{1};
if length(name) > 15
name = [name(1:13), '...'];
end
legend_names{i} = name;
end
legend(legend_names, 'Location', 'best');
title('去雾方法性能指标雷达图', 'FontSize', 14, 'FontWeight', 'bold');
% 添加原始数值表
fprintf('\n最佳方法详细指标:\n');
fprintf('%-30s', '指标');
for i = 1:length(top_methods)
fprintf(' %-20s', legend_names{i});
end
fprintf('\n%s\n', repmat('-', 1, 90));
for j = 1:num_metrics
fprintf('%-30s', metrics_names{j});
for i = 1:length(top_methods)
fprintf(' %-20.3f', data(i, j));
end
fprintf('\n');
end
end
%% 15. 保存结果
fprintf('\n=== 保存处理结果 ===\n');
% 创建保存目录
save_dir = 'dehazing_results';
if ~exist(save_dir, 'dir')
mkdir(save_dir);
end
% 保存原始图像
imwrite(foggy_img, fullfile(save_dir, '01_original_foggy.jpg'));
% 保存所有去雾结果
for i = 1:size(results, 1)
if isempty(results{i, 1}), continue; end
filename = sprintf('%02d_%s.jpg', i+1, ...
regexprep(results{i, 1}, '[^a-zA-Z0-9]', '_'));
imwrite(results{i, 2}, fullfile(save_dir, filename));
end
% 保存评估结果到文本文件
fid = fopen(fullfile(save_dir, 'evaluation_results.txt'), 'w');
fprintf(fid, '基于直方图优化的图像去雾技术评估结果\n');
fprintf(fid, '生成时间: %s\n\n', datestr(now));
fprintf(fid, '%-35s %10s %10s %10s %10s %10s %10s\n', ...
'方法', 'CIR', '熵', '熵改进', '梯度改进', '亮度保持', 'SSIM');
fprintf(fid, '%s\n', repmat('-', 1, 95));
for i = 1:size(results, 1)
if isempty(results{i, 1}), continue; end
metrics = results{i, 3};
fprintf(fid, '%-35s %10.3f %10.3f %10.3f %10.3f %10.3f %10.3f\n', ...
results{i, 1}, ...
metrics.CIR, ...
metrics.Entropy, ...
metrics.EntropyImprovement, ...
metrics.GradientImprovement, ...
metrics.BrightnessPreservation, ...
metrics.SSIM);
end
fclose(fid);
% 保存MAT文件以便后续分析
save(fullfile(save_dir, 'dehazing_data.mat'), ...
'foggy_img', 'results', 'orig_stats');
fprintf('结果已保存到文件夹: %s\n', save_dir);
fprintf('\n=== 程序执行完成 ===\n');
程序功能说明
1. 核心去雾算法
- 标准直方图均衡化:基础的全局直方图均衡化
- 自适应直方图均衡化(CLAHE):局部自适应对比度增强
- LAB空间CLAHE色彩恢复:在LAB色彩空间处理,更好地保持颜色
- 多尺度Retinex+直方图均衡化:结合Retinex理论和直方图优化
- 暗通道先验+CLAHE优化:结合物理去雾模型和直方图优化
2. 图像质量评估指标
- 对比度改进比(CIR):衡量对比度提升程度
- 信息熵:衡量图像信息量
- 平均梯度:衡量图像清晰度
- 亮度保持度:衡量亮度变化程度
- 结构相似性(SSIM):衡量结构相似性
3. 可视化功能
- 原始图像与去雾结果对比
- RGB直方图分析
- 性能指标雷达图
- 综合比较图
4. 实用工具函数
- 添加雾效(用于测试)
- 图像统计计算
- 结果保存和导出
参考代码 基于直方图优化的图像去雾技术matlab www.3dddown.com/csb/96620.html
使用说明
基本使用:
- 直接运行程序,会提示选择雾天图像
- 如果没有选择图像,程序会使用内置示例或生成模拟雾天图像
- 程序自动应用5种不同的直方图优化去雾方法
- 显示所有处理结果和性能比较
自定义参数:
- 在相应的函数中调整参数,如:
- CLAHE的
clip_limit和tile_size - 暗通道先验的
omega参数 - Retinex的尺度参数
- CLAHE的
扩展功能:
- 添加新的去雾方法到
methods数组中 - 修改评估指标以适应特定应用
- 调整可视化输出格式
输出结果
程序会生成:
- 综合比较图:显示所有去雾结果
- 直方图比较图:显示直方图变化
- 性能指标雷达图:直观比较不同方法
- 保存的去雾图像 :在
dehazing_results文件夹中 - 评估报告:文本格式的详细评估结果
算法特点
- 直方图均衡化:简单快速,但可能过度增强噪声
- CLAHE:局部自适应,避免过度增强,保持细节
- LAB空间处理:更好地分离亮度和颜色信息
- Retinex理论:模拟人类视觉系统,增强局部对比度
- 暗通道先验:基于物理模型,更符合真实去雾过程