数学建模_基于对数和傅里叶变换的多通道图像增强模型(处理模糊)Matlab代码包教会使用,直接替换数据即可

图像增强模型:基于对数和傅里叶变换的多通道增强


模型简介

本博客介绍一种基于对数变换(Logarithmic Transformation)和傅里叶变换(FFT)的图像增强方法。该方法结合多尺度高斯滤波器和拉普拉斯模糊度分布评估,能够显著提高图像的对比度,增强细节部分,同时减少模糊区域的影响。

该模型适用于多通道图像(如RGB图像)的增强,具有广泛的实际应用,例如卫星图像处理、医学影像增强等。


模型原理

图像增强的核心在于提取和突出图像的细节信息,同时抑制噪声和模糊区域。该方法综合应用以下技术:

  1. 对数变换

    对数变换通过拉伸图像的低亮度区域,使得暗部细节更加清晰。对输入像素值 II 应用公式:

    Ilog=log⁡(I+1)I_{\text{log}} = \log(I + 1)

  2. 傅里叶变换

    利用傅里叶变换对图像进行频域分析,结合高斯滤波器抑制低频成分,从而增强高频细节。

  3. 多尺度高斯滤波

    通过不同尺度的高斯滤波器对图像进行多级滤波,得到的频域信息能够捕捉不同细节层次:

    G ( x , y ; σ ) = 1 2 π σ 2 e − x 2 + y 2 2 σ 2 G(x, y; \sigma) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2 + y^2}{2\sigma^2}} G(x,y;σ)=2πσ21e−2σ2x2+y2

  4. 归一化与直方图均衡化

    对增强结果进行归一化,并利用自适应直方图均衡化(CLAHE)进一步优化对比度。

  5. 模糊度分布

    通过拉普拉斯算子的方差倒数评估图像清晰度,用以比较增强前后的模糊分布变化。


算法步骤

1. 多通道图像分解与处理

将输入RGB图像分解为红、绿、蓝三个通道,每个通道分别进行以下步骤:

  • 对数变换
  • 多尺度高斯滤波增强
  • 归一化与自适应直方图均衡化

2. 通道合并

处理后的三个通道重新组合成增强后的RGB图像。

3. 模糊度计算

计算增强前后图像的模糊度分布,对比增强效果。


代码讲解

以下为核心代码的逐步解析:

1. 主函数 LogFFTEnhancement

matlab 复制代码
function LogFFTEnhancement()
    % 输入图像名称并读取
    image_name = input('请输入图片名称(包括后缀):', 's');
    image_path = fullfile('Attachment 2', image_name);

    % 检查图像是否存在
    if ~isfile(image_path)
        error('图片 %s 不存在,请检查文件名或路径!', image_name);
    end

    % 读取图片
    I = imread(image_path);

    % 分解RGB通道并分别处理
    R = processChannel(double(I(:, :, 1)), size(I, 1), size(I, 2), 125);
    G = processChannel(double(I(:, :, 2)), size(I, 1), size(I, 2), 125);
    B = processChannel(double(I(:, :, 3)), size(I, 1), size(I, 2), 125);

    % 合并增强后的通道
    result = cat(3, R, G, B);

    % 显示和保存增强结果
    output_image = saveAndShowResults(I, result, 'LogFFTEnhanced', image_name);

    % 计算和展示模糊度分布
    plotBlurComparison(I, im2uint8(result));

    fprintf('增强后的图像已保存至:%s\n', output_image);
end

2. 通道处理函数 processChannel

matlab 复制代码
function output = processChannel(channel, N1, M1, a)
    % 对数变换
    channel_log = log(channel + 1);

    % 傅里叶变换
    channel_fft = fft2(channel);

    % 多尺度高斯滤波增强
    sigmas = [128, 256, 512];
    channel_result = zeros(N1, M1);
    for sigma = sigmas
        F = fspecial('gaussian', [N1, M1], sigma);
        Efft = fft2(double(F));
        D = ifft2(channel_fft .* Efft);
        D_log = log(D + 1);
        channel_result = channel_result + (channel_log - D_log);
    end
    channel_result = channel_result / numel(sigmas);

    % 归一化处理
    MIN = min(channel_result(:));
    MAX = max(channel_result(:));
    output = (channel_result - MIN) / (MAX - MIN);
    output = adapthisteq(output);
end

3. 模糊度分布计算与绘图

matlab 复制代码
function plotBlurComparison(original_img, enhanced_img)
    % 计算模糊度分布
    num_blocks = 50; % 分块数
    blur_original = calculateBlurDistribution(original_img, num_blocks);
    blur_enhanced = calculateBlurDistribution(enhanced_img, num_blocks);

    % 绘制对比图
    figure;
    plot(1:num_blocks, blur_original, '-o', 'DisplayName', 'Original');
    hold on;
    plot(1:num_blocks, blur_enhanced, '-x', 'DisplayName', 'Enhanced');
    xlabel('Block Number');
    ylabel('Blur Level');
    legend;
    grid on;
end

使用方法

代码全文如下:

matlab 复制代码
function LogFFTEnhancement()
    % 输入图片名称(包括后缀)
    image_name = input('请输入图片名称(包括后缀):', 's');
    image_path = fullfile('Attachment 2', image_name);

    % 检查图片是否存在
    if ~isfile(image_path)
        error('图片 %s 不存在,请检查文件名或路径!', image_name);
    end

    % 读取图片
    I = imread(image_path);
    
    % 提取RGB通道
    R = I(:, :, 1);
    G = I(:, :, 2);
    B = I(:, :, 3);
    R0 = double(R);
    G0 = double(G);
    B0 = double(B);

    [N1, M1] = size(R);

    % 处理红色通道
    Rr = processChannel(R0, N1, M1, 125);

    % 处理绿色通道
    Gg = processChannel(G0, N1, M1, 125);

    % 处理蓝色通道
    Bb = processChannel(B0, N1, M1, 125);

    % 合并通道
    result = cat(3, Rr, Gg, Bb);

    % 显示和保存结果
    output_image = saveAndShowResults(I, result, 'LogFFTEnhanced', image_name);

    % 计算指标
    evaluate_metrics(I, im2uint8(result));

    % 计算模糊度分布并绘制对比图
    plotBlurComparison(I, im2uint8(result));

    fprintf('增强后的图像已保存至:%s\n', output_image);
end

function output = processChannel(channel, N1, M1, a)
    channel_log = log(channel + 1);
    channel_fft = fft2(channel);

    % 多尺度高斯滤波
    sigmas = [128, 256, 512];
    channel_result = zeros(N1, M1);
    for sigma = sigmas
        F = fspecial('gaussian', [N1, M1], sigma);
        Efft = fft2(double(F));
        D = ifft2(channel_fft .* Efft);
        D_log = log(D + 1);
        channel_result = channel_result + (channel_log - D_log);
    end
    channel_result = channel_result / numel(sigmas);

    % 加权和归一化
    II = imadd(imadd(channel, channel), channel);
    C = log(immultiply(channel, a) ./ II + 1);
    channel_result = immultiply(C, channel_result);
    channel_result = exp(channel_result);
    MIN = min(channel_result(:));
    MAX = max(channel_result(:));
    output = (channel_result - MIN) / (MAX - MIN);
    output = adapthisteq(output);
end

function plotBlurComparison(original_img, enhanced_img)
    % 计算处理前后的模糊度对比图

    % 图像分块数
    num_blocks = 50;

    % 计算模糊度分布
    blur_original = calculateBlurDistribution(original_img, num_blocks);
    blur_enhanced = calculateBlurDistribution(enhanced_img, num_blocks);

    % 绘制模糊度对比折线图
    figure;
    plot(1:num_blocks, blur_original, '-o', 'LineWidth', 1.5, 'DisplayName', 'Original');
    hold on;
    plot(1:num_blocks, blur_enhanced, '-x', 'LineWidth', 1.5, 'DisplayName', 'Enhanced');
    xlabel('Block Number');
    ylabel('Blur Level (Reciprocal of Variance)');
    title('Blur Comparison Before and After Enhancement');
    legend;
    grid on;
    hold off;
end

function blur_distribution = calculateBlurDistribution(img, num_blocks)
    % 计算图像分块的模糊度分布
    gray_img = rgb2gray(img);  % 转换为灰度图
    [height, width] = size(gray_img);

    % 分块尺寸
    block_height = floor(height / num_blocks);
    block_width = floor(width / num_blocks);

    blur_distribution = zeros(1, num_blocks);

    for i = 1:num_blocks
        % 定义当前块区域
        row_start = (i - 1) * block_height + 1;
        row_end = min(i * block_height, height);

        % 提取当前块
        block = gray_img(row_start:row_end, :);

        % 计算拉普拉斯方差
        laplacian = fspecial('laplacian');
        laplacian_response = imfilter(double(block), laplacian, 'symmetric');
        blur_distribution(i) = 1 / (var(laplacian_response(:)) + 1e-6);  % 使用倒数作为模糊度
    end
end
  1. 准备图像文件 : 将需要增强的图像文件放入指定的文件夹(例如 Attachment 2)。
  2. 运行代码 : 在 MATLAB 命令行中运行 LogFFTEnhancement,输入图像名称(包括后缀,如 example.jpg)。
  3. 查看结果: 程序会保存增强后的图像,并绘制增强前后的模糊度分布对比图。
  4. 指标评估: 代码会输出增强前后的模糊度指标和对比图,用于验证增强效果。

总结

本模型基于对数变换和傅里叶变换,结合多尺度高斯滤波和模糊度评估技术,显著提升了图像的对比度和细节表达能力。代码实现简洁且模块化,便于调整参数以适应不同场景需求。


改进方向

  • 可以引入更多滤波器类型,进一步提升增强效果。
  • 针对不同场景优化参数(如高斯滤波器的尺度)。
  • 添加噪声抑制模块以处理低信噪比图像。
相关推荐
cs8219848318 分钟前
QT 设置高DIP支持多分屏幕,window缩放比例问题等
开发语言·qt·依赖倒置原则
gxchai15 分钟前
用PythonSudio在控件中添加、删除控件,并传递参数(以ScrollBox中添加删除按钮为例)
开发语言·python
榕树子28 分钟前
[java] 什么是 Apache Felix
java·开发语言·apache
雯0609~36 分钟前
C#winform:连接mysql,并将数据展示到页面
开发语言·c#
@Crazy Snail37 分钟前
C# 多线程异步--Token
开发语言·c#·token·task
AICodeThunder38 分钟前
C++知识点总结(58):序列型动态规划
开发语言·c++·动态规划
好玩的Matlab(NCEPU)1 小时前
C#+数据库 实现动态权限设置
开发语言·数据库·c#
无限大.1 小时前
C++ String
java·开发语言·c++
涔溪1 小时前
Python网络爬虫基础
开发语言·爬虫·python
xcLeigh2 小时前
C# Winform 俄罗斯方块小游戏源码
开发语言·c#