MATLAB微光图像增强综合实现

在MATLAB中进行微光图像增强,核心是通过一系列算法提升图像的亮度、对比度和细节,同时抑制噪声。

MATLAB微光图像增强综合实现

1. 主增强框架 lowlight_enhance_main.m

%% 微光图像增强综合框架
clear; close all; clc;

% 1. 读取微光图像(请替换为你的图像路径)
image_path = 'lowlight_image.jpg'; % 示例,请修改
if ~exist(image_path, 'file')
    % 使用MATLAB内置低照度图像示例(如无自定义图像)
    img = im2double(imread('office_1.jpg')); % 需要Image Processing Toolbox
    fprintf('使用MATLAB示例图像,请替换第6行路径使用自己的图像\n');
else
    img = im2double(imread(image_path));
end

% 转换为灰度图(彩色增强在后面单独处理)
if size(img, 3) == 3
    img_gray = rgb2gray(img);
    is_color = true;
else
    img_gray = img;
    is_color = false;
    img = cat(3, img_gray, img_gray, img_gray); % 转为伪彩色以便统一处理
end

% 2. 显示原始图像
figure('Position', [100, 100, 1400, 600]);
subplot(2, 4, 1);
imshow(img); title('原始微光图像', 'FontSize', 10);

% 3. 执行不同的增强方法
fprintf('正在执行图像增强处理...\n');

% 方法1: 直方图均衡化 (基础)
enhanced_histeq = histeq_method(img_gray);
if is_color
    enhanced_histeq_color = zeros(size(img));
    for c = 1:3
        enhanced_histeq_color(:,:,c) = histeq_method(img(:,:,c));
    end
end

% 方法2: CLAHE (对比度受限的自适应直方图均衡化)
enhanced_clahe = clahe_method(img_gray);
if is_color
    enhanced_clahe_color = zeros(size(img));
    for c = 1:3
        enhanced_clahe_color(:,:,c) = clahe_method(img(:,:,c));
    end
end

% 方法3: 基于Retinex理论的增强 (MSR/多尺度Retinex)
enhanced_retinex = retinex_method(img_gray);
if is_color
    enhanced_retinex_color = retinex_color_method(img);
end

% 方法4: 暗通道先验去雾法 (可用于微光增强)
enhanced_dcp = dark_channel_method(img);

% 方法5: 融合增强 (结合多种方法优点)
enhanced_fusion = fusion_enhancement_method(img);

% 4. 显示所有增强结果
% 灰度图增强结果显示
subplot(2, 4, 2);
imshow(enhanced_histeq); title('直方图均衡化', 'FontSize', 10);

subplot(2, 4, 3);
imshow(enhanced_clahe); title('CLAHE增强', 'FontSize', 10);

subplot(2, 4, 4);
imshow(enhanced_retinex); title('Retinex增强', 'FontSize', 10);

% 彩色图增强结果显示
if is_color
    subplot(2, 4, 5);
    imshow(enhanced_dcp); title('暗通道先验增强', 'FontSize', 10);
    
    subplot(2, 4, 6);
    imshow(enhanced_fusion); title('融合增强', 'FontSize', 10);
    
    % 方法6: 深度学习方法 (需深度学习工具箱)
    try
        enhanced_deep = deep_learning_method(img);
        subplot(2, 4, 7);
        imshow(enhanced_deep); title('深度学习增强', 'FontSize', 10);
    catch
        subplot(2, 4, 7);
        imshow(img); title('深度学习法需额外配置', 'FontSize', 10);
        text(size(img,2)/2-100, size(img,1)/2, '需要Deep Learning Toolbox', ...
            'Color', 'red', 'FontSize', 12);
    end
    
    % 原图与最佳结果的对比
    subplot(2, 4, 8);
    montage({img, enhanced_fusion}, 'Size', [1, 2]);
    title('原始 vs 融合增强', 'FontSize', 10);
end

sgtitle('微光图像增强方法对比', 'FontSize', 14, 'FontWeight', 'bold');

% 5. 客观质量评估
if is_color
    fprintf('\n=== 图像质量评估 ===\n');
    evaluate_image_quality(img, enhanced_fusion);
end

2. 核心增强算法实现 enhancement_methods.m

%% 核心增强算法函数集

function enhanced = histeq_method(img)
    % 直方图均衡化 (基础方法)
    % 优点:简单快速,全局对比度提升
    % 缺点:可能过度增强噪声
    
    enhanced = histeq(img);
end

function enhanced = clahe_method(img, varargin)
    % CLAHE - 对比度受限的自适应直方图均衡化
    % 优点:局部对比度增强,避免噪声放大
    % 参数:ClipLimit(默认0.01), NumTiles(默认[8,8])
    
    if nargin < 2
        clip_limit = 0.01;  % 对比度限制阈值
    else
        clip_limit = varargin{1};
    end
    
    if nargin < 3
        num_tiles = [8, 8]; % 分块数量
    else
        num_tiles = varargin{2};
    end
    
    % 使用adapthisteq函数
    enhanced = adapthisteq(img, 'ClipLimit', clip_limit, ...
        'NumTiles', num_tiles, 'Distribution', 'uniform');
end

function enhanced = retinex_method(img)
    % 基于Retinex理论的单尺度增强
    % 原理:S = R * L,增强反射分量R
    
    % 高斯滤波估计光照分量L
    sigma = 80; % 高斯核标准差,控制尺度
    h = fspecial('gaussian', min(size(img))*2+1, sigma);
    L = imfilter(img, h, 'replicate');
    L = L + 0.01; % 避免除零
    
    % 计算反射分量R
    R = log(img + 0.01) - log(L);
    
    % 对反射分量进行增强
    R_enhanced = (R - min(R(:))) / (max(R(:)) - min(R(:)));
    
    % 可选:对光照分量进行调整
    L_enhanced = imadjust(L, [0.1, 0.9], []);
    
    % 合成增强图像
    enhanced = R_enhanced .* L_enhanced;
    enhanced = (enhanced - min(enhanced(:))) / (max(enhanced(:)) - min(enhanced(:)));
end

function enhanced = retinex_color_method(img_rgb)
    % 彩色图像的MSR (多尺度Retinex) 增强
    % 使用三个不同尺度的Retinex结果进行融合
    
    scales = [15, 80, 250]; % 三个尺度
    weight = [1/3, 1/3, 1/3]; % 权重
    
    enhanced = zeros(size(img_rgb));
    
    for channel = 1:3
        channel_img = img_rgb(:,:,channel);
        msr_result = zeros(size(channel_img));
        
        for s = 1:length(scales)
            % 当前尺度的高斯核
            h = fspecial('gaussian', min(size(channel_img))*2+1, scales(s));
            L = imfilter(channel_img, h, 'replicate');
            L = L + 0.01;
            
            % Retinex计算
            R = log(channel_img + 0.01) - log(L);
            msr_result = msr_result + weight(s) * R;
        end
        
        % 后处理:颜色恢复
        msr_result = (msr_result - min(msr_result(:))) / ...
            (max(msr_result(:)) - min(msr_result(:)));
        
        % 颜色恢复因子
        alpha = 0.1; % 颜色恢复强度
        color_restore = alpha * log(channel_img + 0.01);
        msr_result = msr_result .* (1 + color_restore);
        
        enhanced(:,:,channel) = msr_result;
    end
    
    % 归一化到[0,1]
    enhanced = (enhanced - min(enhanced(:))) / (max(enhanced(:)) - min(enhanced(:)));
end

function enhanced = dark_channel_method(img_rgb)
    % 基于暗通道先验的增强 (原用于去雾,对微光也有效)
    % 原理:微光图像可视为有雾图像,通过去雾实现增强
    
    % 1. 计算暗通道
    patch_size = 15; % 局部块大小
    dark_channel = get_dark_channel(img_rgb, patch_size);
    
    % 2. 估计大气光值 (取暗通道最亮的前0.1%)
    [~, idx] = sort(dark_channel(:), 'descend');
    num_pixels = numel(dark_channel);
    atmospheric = zeros(1, 3);
    
    for c = 1:3
        atmospheric(c) = max(max(img_rgb(idx(1:ceil(num_pixels*0.001)), c)));
    end
    
    % 3. 估计透射率
    omega = 0.95; % 保留少量雾感,避免过度增强
    transmission = 1 - omega * get_dark_channel(img_rgb./reshape(atmospheric, 1, 1, 3), patch_size);
    
    % 4. 软抠图优化透射率 (使用引导滤波)
    guided_filter_radius = 40;
    guided_filter_eps = 0.001;
    refined_transmission = guided_filter(rgb2gray(img_rgb), transmission, ...
        guided_filter_radius, guided_filter_eps);
    
    % 5. 恢复无雾图像
    t0 = 0.1; % 避免除零
    enhanced = zeros(size(img_rgb));
    
    for c = 1:3
        enhanced(:,:,c) = (img_rgb(:,:,c) - atmospheric(c)) ./ ...
            max(refined_transmission, t0) + atmospheric(c);
    end
    
    % 6. 后处理:对比度拉伸
    enhanced = imadjust(enhanced, stretchlim(enhanced, 0.001), []);
end

function dark_channel = get_dark_channel(img_rgb, patch_size)
    % 计算暗通道
    [m, n, ~] = size(img_rgb);
    pad_size = floor(patch_size/2);
    
    % 边界填充
    img_padded = padarray(img_rgb, [pad_size, pad_size], 'replicate');
    dark_channel = zeros(m, n);
    
    % 计算每个局部块的最小值
    for i = 1:m
        for j = 1:n
            patch = img_padded(i:i+patch_size-1, j:j+patch_size-1, :);
            dark_channel(i, j) = min(patch(:));
        end
    end
end

function q = guided_filter(I, p, r, eps)
    % 引导滤波实现
    % I: 引导图像, p: 输入图像, r: 窗口半径, eps: 正则化参数
    
    [m, n] = size(I);
    N = boxfilter(ones(m, n), 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)
    % 盒滤波 (快速实现)
    [hei, wid] = size(imSrc);
    imDst = zeros(size(imSrc));
    
    % 累加y方向
    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, :);
    
    % 累加x方向
    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

function enhanced = fusion_enhancement_method(img_rgb)
    % 融合增强:结合CLAHE、Retinex和暗通道的优点
    
    % 1. 分别使用不同方法增强
    % CLAHE增强 (局部细节)
    clahe_enhanced = zeros(size(img_rgb));
    for c = 1:3
        clahe_enhanced(:,:,c) = clahe_method(img_rgb(:,:,c), 0.02, [4, 4]);
    end
    
    % Retinex增强 (色彩和光照)
    retinex_enhanced = retinex_color_method(img_rgb);
    
    % 暗通道增强 (全局对比度)
    dcp_enhanced = dark_channel_method(img_rgb);
    
    % 2. 计算各方法的权重图
    % 基于局部对比度的权重
    gray_img = rgb2gray(img_rgb);
    local_contrast = stdfilt(gray_img, ones(3)); % 局部标准差作为对比度
    
    % 基于亮度的权重(微光区域更信任Retinex)
    brightness = mean(img_rgb, 3);
    dark_weight = 1 - brightness; % 暗区权重高
    
    % 3. 多尺度融合
    enhanced = zeros(size(img_rgb));
    
    for c = 1:3
        % 构造权重图
        w1 = local_contrast .* dark_weight; % CLAHE权重
        w2 = dark_weight;                   % Retinex权重
        w3 = brightness;                    % 暗通道权重
        
        % 归一化权重
        w_sum = w1 + w2 + w3 + 0.001;
        w1 = w1 ./ w_sum;
        w2 = w2 ./ w_sum;
        w3 = w3 ./ w_sum;
        
        % 加权融合
        enhanced(:,:,c) = w1.*clahe_enhanced(:,:,c) + ...
                          w2.*retinex_enhanced(:,:,c) + ...
                          w3.*dcp_enhanced(:,:,c);
    end
    
    % 4. 后处理:锐化和颜色调整
    enhanced = imsharpen(enhanced, 'Amount', 0.5, 'Radius', 1);
    enhanced = imadjust(enhanced, stretchlim(enhanced, 0.005), []);
end

function enhanced = deep_learning_method(img_rgb)
    % 基于深度学习的增强 (需深度学习工具箱)
    % 使用预训练的神经网络模型
    
    try
        % 尝试加载预训练模型(需要MATLAB R2020b+)
        model_name = 'lowlight-enhance-net'; % 示例模型名
        
        % 如果本地没有模型,下载或使用替代方案
        net = imagePretrainedNetwork('resnet18'); % 使用ResNet作为示例
        
        % 预处理:调整大小以适应网络输入
        target_size = [224, 224];
        img_resized = imresize(img_rgb, target_size);
        
        % 使用网络特征进行增强(简化版本)
        % 实际应用中需要专门的微光增强网络
        features = activations(net, img_resized, 'conv1');
        
        % 后处理:将特征转换回图像
        enhanced = imresize(mean(features, 3), size(img_rgb(:,:,1)));
        enhanced = cat(3, enhanced, enhanced, enhanced);
        enhanced = (enhanced - min(enhanced(:))) / (max(enhanced(:)) - min(enhanced(:)));
        
    catch
        % 如果深度学习工具箱不可用,使用传统方法替代
        fprintf('深度学习工具箱不可用,使用传统方法替代\n');
        enhanced = fusion_enhancement_method(img_rgb);
    end
end

3. 质量评估函数 quality_evaluation.m

function evaluate_image_quality(original, enhanced)
    % 图像质量客观评估
    
    % 1. 亮度评估
    orig_brightness = mean(original(:));
    enh_brightness = mean(enhanced(:));
    brightness_improvement = (enh_brightness - orig_brightness) / orig_brightness * 100;
    
    fprintf('亮度提升: %.1f%% (原始: %.3f -> 增强: %.3f)\n', ...
        brightness_improvement, orig_brightness, enh_brightness);
    
    % 2. 对比度评估 (标准差)
    orig_contrast = std(original(:));
    enh_contrast = std(enhanced(:));
    contrast_improvement = (enh_contrast - orig_contrast) / orig_contrast * 100;
    
    fprintf('对比度提升: %.1f%% (原始: %.3f -> 增强: %.3f)\n', ...
        contrast_improvement, orig_contrast, enh_contrast);
    
    % 3. 信息熵 (丰富度)
    orig_entropy = entropy(original);
    enh_entropy = entropy(enhanced);
    entropy_improvement = (enh_entropy - orig_entropy) / orig_entropy * 100;
    
    fprintf('信息熵提升: %.1f%% (原始: %.3f -> 增强: %.3f)\n', ...
        entropy_improvement, orig_entropy, enh_entropy);
    
    % 4. 峰值信噪比 (PSNR)
    psnr_value = psnr(enhanced, original);
    fprintf('PSNR: %.2f dB\n', psnr_value);
    
    % 5. 结构相似性 (SSIM)
    ssim_value = ssim(enhanced, original);
    fprintf('SSIM: %.3f (越接近1越好)\n', ssim_value);
    
    % 6. 无参考图像质量评估 (NR-IQA)
    % 基于自然场景统计的质量评估
    [score, ~] = niqe(enhanced); % 需要IQA工具箱或自定义实现
    fprintf('NIQE分数: %.3f (越小越好)\n', score);
    
    % 7. 可视化评估指标
    figure('Position', [100, 100, 800, 400]);
    
    subplot(1, 2, 1);
    % 亮度分布对比
    [counts_orig, bins] = imhist(rgb2gray(original));
    [counts_enh, ~] = imhist(rgb2gray(enhanced));
    
    plot(bins, counts_orig/max(counts_orig), 'b-', 'LineWidth', 1.5); hold on;
    plot(bins, counts_enh/max(counts_enh), 'r-', 'LineWidth', 1.5);
    xlabel('灰度值'); ylabel('归一化频数');
    legend('原始图像', '增强图像');
    title('亮度分布对比'); grid on;
    
    subplot(1, 2, 2);
    % 指标雷达图
    metrics = [brightness_improvement/100, ...
               contrast_improvement/100, ...
               entropy_improvement/100, ...
               ssim_value, ...
               max(0, 1 - score/50)]; % NIQE转换
    
    metrics = max(0, min(1, metrics)); % 限制在[0,1]
    
    labels = {'亮度', '对比度', '信息熵', 'SSIM', '质量'};
    radar_plot(metrics, labels);
    title('增强效果评估雷达图');
end

function radar_plot(data, labels)
    % 绘制雷达图
    n = length(data);
    angles = linspace(0, 2*pi, n+1);
    angles = angles(1:end-1);
    
    data = [data, data(1)]; % 闭合
    angles = [angles, angles(1)];
    
    % 转换为直角坐标
    x = data .* cos(angles);
    y = data .* sin(angles);
    
    plot(x, y, 'b-o', 'LineWidth', 2, 'MarkerFaceColor', 'b'); hold on;
    fill(x, y, 'b', 'FaceAlpha', 0.2);
    
    % 添加标签
    for i = 1:n
        text(1.1*cos(angles(i)), 1.1*sin(angles(i)), labels{i}, ...
            'HorizontalAlignment', 'center', 'FontSize', 10);
    end
    
    axis equal; grid on; axis([-1.2, 1.2, -1.2, 1.2]);
    set(gca, 'XTick', [], 'YTick', []);
end

不同增强方法对比与选择指南

方法 核心思想 优点 缺点 适用场景
直方图均衡化 全局重分布像素亮度 计算快,简单有效 易放大噪声,可能过增强 快速预览,低噪声图像
CLAHE 局部块直方图均衡化 保持细节,抑制噪声放大 参数需调整,块效应风险 医学图像,纹理丰富的场景
Retinex理论 分离光照和反射分量 色彩保真,模拟人眼感知 计算复杂,可能有光晕 色彩重要的自然场景
暗通道先验 基于去雾理论的增强 有效提升全局对比度 计算量大,参数敏感 雾霾、朦胧的微光场景
融合增强 多方法加权融合 综合优势,鲁棒性强 实现复杂,计算成本高 高质量要求,复杂光照条件
深度学习 神经网络学习映射 适应性强,端到端优化 需要大量数据,训练复杂 大数据场景,研究前沿

参考代码 基于阈值分割的车牌定位识别 www.youwenfan.com/contentcnn/96014.html

实用建议与调试技巧

  1. 参数调整指南

    • CLAHE的ClipLimit:从0.01开始,噪声大则减小,细节不足则增大
    • Retinex的尺度参数:多尺度通常比单尺度效果好
    • 融合权重:根据图像内容动态调整,暗区侧重Retinex,亮区侧重CLAHE
  2. 常见问题解决

    • 噪声放大:增强前先进行轻度高斯滤波(imgaussfilt(img, 0.5)
    • 色彩失真:在Lab色彩空间处理亮度通道,保持ab色彩通道不变
    • 细节丢失:增强前后进行细节层分离与融合
  3. 进阶优化方向

    % 1. 基于深度学习的超分辨率 + 增强联合优化
    % 2. 生成对抗网络(GAN)用于自然感增强
    % 3. 注意力机制聚焦重要区域增强
    % 4. 多曝光图像融合生成HDR效果
    
posted @ 2025-12-20 10:08  lingxingqi  阅读(1)  评论(0)    收藏  举报