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

news2024/11/26 18:30:47

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


模型简介

本博客介绍一种基于对数变换(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πσ21e2σ2x2+y2

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

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


算法步骤

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

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

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

2. 通道合并

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

3. 模糊度计算

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


代码讲解

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

1. 主函数 LogFFTEnhancement

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

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. 模糊度分布计算与绘图

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

使用方法

代码全文如下:

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. 指标评估: 代码会输出增强前后的模糊度指标和对比图,用于验证增强效果。

总结

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


改进方向

  • 可以引入更多滤波器类型,进一步提升增强效果。
  • 针对不同场景优化参数(如高斯滤波器的尺度)。
  • 添加噪声抑制模块以处理低信噪比图像。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2247987.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

echarts4r 教程2:Advanced

❝ 写在前面 本文为 R 语言 echarts4r 包的学习笔记。本着自己学习、分享他人的态度,分享学习笔记,希望能对大家有所帮助。软件可能随时更新,建议配合官方文档一起阅读。推荐先按顺序阅读往期内容: 1. echarts4r 教程1&#xff1a…

JSON 性能测试 - WastJson 性能也很快

WAST 是一个高性能 Java 工具集库包,包括 JSON、YAML、CSV、HttpClient、JDBC 和 EL 引擎. WastJson 无论是小中大文本各种数据类型等性能都没有明显的短板,除了推广外可以说是六边形战士,更多测试参考 wast-jmh-test: wast性能测试 (并非所…

DICOM图像处理:深入解析DICOM彩色图像中的Planar配置及其对像素数据解析处理的实现

引言 在DICOM(Digital Imaging and Communications in Medicine)标准中,彩色图像的存储与显示涉及多个关键属性,其中**Planar Configuration(平面配置)**属性(标签 (0028,0006))尤为重要。当遇到彩色DICOM图像在浏览时被错误地分割为9张小图,而实际应显示为一…

django authentication 登录注册

文章目录 前言一、django配置二、后端实现1.新建app2.编写view3.配置路由 三、前端编写1、index.html2、register.html3、 login.html 总结 前言 之前,写了django制作简易登录系统,这次利用django内置的authentication功能实现注册、登录 提示&#xff…

数字图像处理(4):FPGA中的定点数、浮点数

(1)定点数:小数点固定在数据的某一位置的数,可以分为定点整数和定点小数和普通定点数。定点数广泛应用于数字图像处理(图像滤波、图像缩放)和数字信号处理(如FFT、定点卷积)中。 定…

uniapp接入高德地图

下面代码兼容安卓APP和H5 高德地图官网:我的应用 | 高德控制台 ,绑定服务选择《Web端(JS API)》 /utils/map.js 需要设置你自己的key和安全密钥 export function myAMap() {return new Promise(function(resolve, reject) {if (typeof window.onLoadM…

三种蓝牙架构实现方案

一、蓝牙架构方案 1、hostcontroller双芯片标准架构 手机里面包含很多SoC或者模块,每颗SoC或者模块都有自己独有的功能,比如手机应用跑在AP芯片上,显示屏,3G/4G通信,WiFi/蓝牙等都有自己专门的SoC或者模块&#xff0…

下载并安装Visual Studio 2017过程

一、下载 1、下载链接 下载链接:官方网址 先登录 往下滑找到较早的下载 2、进行搜索下载 或者直接点击🔗网站跳转 3、确认系统信息进行下载 二、安装 下载完成后右键使用管理员身份运行 1、点击同意后安装 2、若报错—设置失败 打开控制面板-&g…

1-golang_org_x_crypto_bcrypt测试 --go开源库测试

1.实例测试 package mainimport ("fmt""golang.org/x/crypto/bcrypt" )func main() {password : []byte("mysecretpassword")hashedPassword, err : bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)if err ! nil {fmt.Println(err)…

卷积神经网络学习记录

目录 神经网络基础定义: 基本组成部分 工作流程 卷积层(卷积定义)【CONV】: 卷积层(Convolutional Layer) 特征提取:卷积层的主要作用是通过卷积核(或滤波器)运算提…

Java安全—JNDI注入RMI服务LDAP服务JDK绕过

前言 上次讲到JNDI注入这个玩意,但是没有细讲,现在就给它详细地讲个明白。 JNDI注入 那什么是JNDI注入呢,JNDI全称为 Java Naming and Directory Interface(Java命名和目录接口),是一组应用程序接口&…

设计模式之 模板方法模式

模板方法模式是行为型设计模式的一种。它定义了一个算法的骨架,并将某些步骤的实现延迟到子类中。模板方法模式允许子类在不改变算法结构的情况下重新定义算法的某些特定步骤。 模板方法模式的核心在于: 封装算法的骨架:通过父类中的模板方…

学习threejs,使用设置bumpMap凹凸贴图创建褶皱,实现贴图厚度效果

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.MeshPhongMaterial高…

日常开发记录-正确的prop传参,reduce搭配promise的使用

日常开发记录-正确的prop传参&#xff0c;reduce搭配promise的使用 1.正确的prop传参2.reduce搭配promise的使用 1.正确的prop传参 一般会的父组件传参子组件 //父组件 <A :demodata.sync"testData" :listData.sync"testData2"></A> data ()…

RedHat 10 Beta Install

RedHat 10 beta 前言 Red Hat Enterprise Linux 10.0 Beta 附带内核版本 6.11.0,该版本为以下架构提供最低要求版本支持(括号中注明) AMD 和 Intel 64 位架构(x86-64-v3)64 位 ARM 架构(ARMv8.0-A)IBM Power Systems,小端(POWER9)64 位 IBM Z (z14)RHEL 安装程序的主…

泥石流灾害风险评估与模拟丨AI与R语言、ArcGIS、HECRAS融合,提升泥石流灾害风险预测的精度和准确性

目录 第一章 理论基础 第二章 泥石流风险评估工具 第三章 数据准备与因子提取 第四章 泥石流灾害评价 第五章 HECRAS软件的应用 第六章 操作注意事项与模型优化 泥石流灾害的频发与严重后果&#xff0c;已成为全球范围内防灾减灾工作的重大挑战。随着科技的不断进步&…

android 音效可视化--Visualizer

Visualizer 是使应用程序能够检索当前播放音频的一部分以进行可视化。它不是录音接口&#xff0c;仅返回部分低质量的音频内容。但是&#xff0c;为了保护某些音频数据的隐私&#xff0c;使用 Visualizer 需要 android.permission.RECORD_AUDIO权限。传递给构造函数的音频会话 …

汽车HiL测试:利用TS-GNSS模拟器掌握硬件性能的仿真艺术

一、汽车HiL测试的概念 硬件在环&#xff08;Hardware-in-the-Loop&#xff0c;简称HiL&#xff09;仿真测试&#xff0c;是模型基于设计&#xff08;Model-Based Design&#xff0c;简称MBD&#xff09;验证流程中的一个关键环节。该步骤至关重要&#xff0c;因为它整合了实际…

基于Boost库的搜索引擎

本专栏内容为&#xff1a;项目专栏 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;基于Boots的搜索引擎 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &#x1f339;&#x1f339;&#x1f339;关注我带你学习编程知识…

二叉树oj题解析

二叉树 二叉树的最近公共祖先什么是最近公共祖先&#xff1f;leetcode中求二叉树中最近公共祖先解题1.解题2. 根据二叉树创建字符串 二叉树的最近公共祖先 什么是最近公共祖先&#xff1f; 最近的公共祖先指的是这一棵树中两个节点中深度最大的且公共的祖先节点就是最近祖先节…