数学建模_基于对数和傅里叶变换的多通道图像增强模型(处理模糊)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πσ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 = sigmasF = 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);endchannel_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);
endfunction 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 = sigmasF = 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);endchannel_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);
endfunction 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;
endfunction 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.mzph.cn/news/887433.shtml

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

相关文章

Qt交叉编译x86和arm心得

最近一直在Linux上开发qt程序,主要工作是在x86的Ubuntu上开发编译调试程序,确定没有问题后交叉编译到arm的linux系统上运行 1.环境 Qt的交叉编译环境厂家已经提供了,嵌入式的同事帮我安装调试的,具体就是装了厂家给的gcc编译套件…

LeetCode739. 每日温度(2024冬季每日一题 15)

给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。 示例 1: 输入: temperatu…

React(五)——useContecxt/Reducer/useCallback/useRef/React.memo/useMemo

文章目录 项目地址十六、useContecxt十七、useReducer十八、React.memo以及产生的问题18.1组件嵌套的渲染规律18.2 React.memo18.3 引出问题 十九、useCallback和useMemo19.1 useCallback对函数进行缓存19.2 useMemo19.2.1 基本的使用19.2.2 缓存属性数据 19.2.3 对于更新的理解…

STM32设计学生宿舍监测控制系统-分享

目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 电路图采用Altium Designer进行设计: 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 本项目旨在利用STM32单片机为核心,结合传感器技术、无线通信技…

华为无线AC+AP组网实际应用小结

之前公司都是使用的H3C的交换机、防火墙以及无线AC和AP的,最近优化下无线网络,说新的设备用华为的,然后我是直到要部署的当天才知道用华为设备的,就很无语了,一点准备没有,以下为这次的实际操作记录吧&…

Java学习,继承(1)

Java继承是面向对象的编程特性,允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的字段和方法。通过继承,子类可以获得父类的所有公共(public)和保护(protecte…

二刷代码随想录第13天

二叉树的递归遍历 递归三部曲1.确定递归函数的参数和返回值 2.确定终止条件 3.确定单层的递归逻辑前中后序遍历只需要改一下位置即可 class Solution { public:vector<int> inorderTraversal(TreeNode* root) {vector<int> vec;traversal(root, vec);return vec;…

Linux麦克风录音实战

在 Linux 上使用麦克风进行录音可以通过多种方式实现&#xff0c;包括使用命令行工具、图形界面应用程序以及编程接口。下面我将介绍几种常见的方法&#xff0c;从简单的命令行工具到使用 PortAudio 库进行编程。 一. 使用arecord命令行工具 arecord 是 ALSA&#xff08;Adva…

虚拟苹果系统MacOS中新建自定义C++Dylib并用C++测试程序测试

前言 苹果系统中Dylib的建立和使用是一个非常基础的功能。本博客使用苹果虚拟机MacOS Ventura 13.6.7&#xff0c;XCode15.2&#xff0c;来复现这个过程。供参考。 1、Dylib框架的建立 2、增加一个函数 注意&#xff0c;向导自动生成的Helloworld函数中嵌套了一个函数Helloworl…

Windows系统电脑安装TightVNC服务端结合内网穿透实现异地远程桌面

文章目录 前言1. 安装TightVNC服务端2. 局域网VNC远程测试3. Win安装Cpolar工具4. 配置VNC远程地址5. VNC远程桌面连接6. 固定VNC远程地址7. 固定VNC地址测试 前言 在追求高效、便捷的数字化办公与生活的今天&#xff0c;远程桌面服务成为了连接不同地点、不同设备之间的重要桥…

树莓派2装FreeBSD14.1 Raspberry Pi2 install FreeBSD14.1 00000121:error:0A000086:SSL

树莓派2代的Model B采用Broadcom BCM2836 900MHz的四核SoC&#xff0c;1GB内存&#xff0c;是新一代开拓者&#xff0c;兼容1代B。相比之下&#xff0c;树莓派2的性能比1代提升6倍&#xff0c;内存翻了一番。Raspberry Pi 2不仅能跑全系列ARM GNU/Linux发行版&#xff0c;而且支…

ThingsBoard规则链节点:Azure IoT Hub 节点详解

目录 引言 1. Azure IoT Hub 节点简介 2. 节点配置 2.1 基本配置示例 3. 使用场景 3.1 数据传输 3.2 数据分析 3.3 设备管理 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 ThingsBoard 是一个开源的物联网平台&#xff0c;提供了设备…

MySQL获取数据库内所有表格数据总数

在 MySQL 中&#xff0c;要获取数据库内所有表格的数据总数&#xff0c;可以编写一个查询脚本来遍历每个表并计算其行数。你可以使用 INFORMATION_SCHEMA 数据库&#xff0c;它包含了关于数据库元数据的表格&#xff0c;如 TABLES 和 COLUMNS。 以下是一个示例脚本&#xff0c…

如何利用 Puppeteer 的 Evaluate 函数操作网页数据

介绍 在现代的爬虫技术中&#xff0c;Puppeteer 因其强大的功能和灵活性而备受青睐。Puppeteer 是一个用于控制 Chromium 或 Chrome 浏览器的 Node.js 库&#xff0c;提供了丰富的 API 接口&#xff0c;能够帮助开发者高效地处理动态网页数据。本文将重点讲解 Puppeteer 的 ev…

开发工具 - VSCode 快捷键

以下是一些常用的 VS Code 快捷键&#xff08;Windows、macOS 和 Linux 均适用&#xff0c;略有不同&#xff09;&#xff1a; 常用快捷键 功能Windows/LinuxmacOS打开命令面板Ctrl Shift P 或 F1Cmd Shift P打开文件Ctrl OCmd O保存文件Ctrl SCmd S全部保存Ctrl K,…

【Leetcode 每日一题】146. LRU 缓存(c++)

146. LRU 缓存 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#x…

【GAMES101笔记速查——Lecture 19 Cameras,Lenses and Light Fields】

本章节内容&#xff1a;相机、棱镜、光场 计算机图形学的两种成像方法&#xff1a; 1.合成方法&#xff1a;光栅化、光线追踪&#xff08;展示出现实没有的东西&#xff09; 2.捕捉方法&#xff1a;相机&#xff08;捕捉现实已有的东西&#xff09; 目录 1 相机 1.1 针孔相…

pytorch经典训练流程

文章目录 [toc]1. **经典训练流程和任务&#xff1a;监督学习****1.1 什么是监督学习&#xff1f;****1.2 为什么要设计训练流程&#xff1f;****1.3 怎么设计训练流程&#xff1f;****代码示例&#xff1a;监督学习的典型流程** 2. **超参数设置****2.1 什么是超参数&#xff…

241124学习日志——[CSDIY] [ByteDance] 后端训练营 [14]

CSDIY&#xff1a;这是一个非科班学生的努力之路&#xff0c;从今天开始这个系列会长期更新&#xff0c;&#xff08;最好做到日更&#xff09;&#xff0c;我会慢慢把自己目前对CS的努力逐一上传&#xff0c;帮助那些和我一样有着梦想的玩家取得胜利&#xff01;&#xff01;&…

001 MATLAB介绍

前言&#xff1a; 软件获取渠道有很多&#xff0c;难点也就是百度网盘下载慢&#xff1b; 线上版本每月有时间限制。 01 MATLAB介绍 性质&#xff1a; MATLAB即Matrix Laboratory 矩阵实验室的意思&#xff0c;是功能强大的计算机高级语言, 已广泛应用于各学科研究部门、…