基于直方图优化的图像去雾技术MATLAB实现

基于直方图优化(直方图均衡化、自适应直方图均衡化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

使用说明

基本使用:

  1. 直接运行程序,会提示选择雾天图像
  2. 如果没有选择图像,程序会使用内置示例或生成模拟雾天图像
  3. 程序自动应用5种不同的直方图优化去雾方法
  4. 显示所有处理结果和性能比较

自定义参数:

  • 在相应的函数中调整参数,如:
    • CLAHE的clip_limittile_size
    • 暗通道先验的omega参数
    • Retinex的尺度参数

扩展功能:

  • 添加新的去雾方法到methods数组中
  • 修改评估指标以适应特定应用
  • 调整可视化输出格式

输出结果

程序会生成:

  1. 综合比较图:显示所有去雾结果
  2. 直方图比较图:显示直方图变化
  3. 性能指标雷达图:直观比较不同方法
  4. 保存的去雾图像 :在dehazing_results文件夹中
  5. 评估报告:文本格式的详细评估结果

算法特点

  1. 直方图均衡化:简单快速,但可能过度增强噪声
  2. CLAHE:局部自适应,避免过度增强,保持细节
  3. LAB空间处理:更好地分离亮度和颜色信息
  4. Retinex理论:模拟人类视觉系统,增强局部对比度
  5. 暗通道先验:基于物理模型,更符合真实去雾过程
相关推荐
熊猫钓鱼>_>2 小时前
GenUI:从“文本对话”到“可操作界面”的范式转移
开发语言·人工智能·agent·sdk·vibecoding·assistant·genui
其实防守也摸鱼2 小时前
部署本地AI大模型--ollma
人工智能·安全·ai·大模型·软件工程·本地大模型
拂晓 AI 编程2 小时前
claude code 加上 PPT Master skill 生成可手改PPT
人工智能·powerpoint
小橙子学AI2 小时前
Rokid AI眼镜皮肤健康检测智能体技术实践
人工智能
QQ676580082 小时前
智慧工地物料堆积识别 工地钢筋木材图像识别 工地砖块目标检测 建筑物大理石图像识别 建筑物工地材料识别 物料堆积识别10349期
人工智能·目标检测·计算机视觉·工地物料堆积·工地钢筋木材图像识别·工地砖块目标检测·建筑物大理石图像
懂AI的老郑2 小时前
时空智能体技术研究与应用
人工智能
Wild API2 小时前
多模型成本治理怎么落地?从任务分层、日志统计到结构优化的一套实战思路
大数据·网络·人工智能
前端摸鱼匠2 小时前
【AI大模型春招面试题22】层归一化(Layer Norm)与批归一化(Batch Norm)的区别?为何大模型更倾向于使用Layer Norm?
开发语言·人工智能·面试·求职招聘·batch
人工智能AI技术2 小时前
索引基础:数据库索引结构与优化原则
人工智能