当前位置: 首页 > news >正文

图像处理中的二维傅里叶变换

图像处理中的二维傅里叶变换

问题来源是对彩色图像进行压缩时得出的傅里叶系数的图像如何解释,导入图片,转化为灰度图片:
#彩色图片一般是由RGB组成,其实就是3个二维数组叠加而成,当R=G=B时,彩色图片就会变成一种灰度颜色,所以灰度颜色的图片其实就是一个二维数组 #灰度化处理总共有三种方法:最大值法、平均值法、加权平均法 A = imread(os.path.join('..','DATA','jelly.jpg')) Abw = np.mean(A, -1); # 转化为灰度图像也可以通过cv2库或者plt, #0:压缩行,对各列求均值,返回 1* n 矩阵,axis =1 :压缩列,对各行求均值,返回 m *1 矩阵
接下来利用快速傅里叶变换,求解二维矩阵(每个变量是灰度值)的傅里叶系数,将所得的绘制在对数坐标系中:At = np.fft.fft2(Abw)#计算二维的傅里叶变换 F = np.log(np.abs(np.fft.fftshift(At))+1) # 将图像中的低频部分移动到图像的中心;将 FFT 置于对数刻度上。得到的图像如下:
灰度图像与傅里叶系数下面介绍一下二维傅里叶变换:连续的傅里叶变换为: F ( u , v ) = ∫ − ∞ ∞ ∫ − ∞ ∞ f ( x , y ) e − 2 π i ( u x + v y ) , d x , d y F(u,v) = \int_{-\infty}^{\infty} \int_{-\infty}^{\infty} f(x,y) e^{-2\pi i(ux+vy)} , dx , dy F(u,v)=f(x,y)e2πi(ux+vy),dx,dy离散的傅里叶变换为: F ( u , v ) = 1 M N ∑ x = 0 M − 1 ∑ y = 0 N − 1 f ( x , y ) e − i 2 π ( u x / M + v y / N ) F(u,v)=\frac{1}{\sqrt{MN}}\sum_{x=0}^{M-1}\sum_{y=0}^{N-1}f(x,y)\mathrm{e}^{-i2\pi(ux/M+vy/N)} F(u,v)=MN 1x=0M1y=0N1f(x,y)ei2π(ux/M+vy/N)各变量的具体意义如下:
f ( x , y ) f(x,y) f(x,y):输入图像的灰度矩阵,即空间域中的图像,也就是灰度值。
F ( u , v ) F(u,v) F(u,v):变换后的复矩阵,表示频率域中的图像。其实部和虚部分别代表频率分量的幅度和相位。
x , y x,y x,y:空间域中的坐标,代表图像中的像素位置,取值范围都是从 0 ∼ M − 1 0 \sim M-1 0M1 0 ∼ N − 1 0\sim N-1 0N1
u , v u,v u,v:频率域中的坐标,代表图像中的频率分量。
M , N M,N M,N:图像的尺寸,即灰度矩阵的宽度和高度。
i i i:虚数单位。
u u u v v v是频率域中的坐标变量,它们分别代表了图像在水平方向和垂直方向上的频率分量。这些频率分量是图像中不同空间频率的正弦波和余弦波的叠加结果, u u u v v v的取值范围和 x , y x,y x,y相同。
下面说一下具体意义:傅里叶变换的物理意义是将图像的灰度分布函数变换为图像的频率分布函数。图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度。如:大面积的沙漠在图像中是一片灰度变化缓慢的区域,对应的频率值很低;而对于地表属性变换剧烈的边缘区域在图像中是一片灰度变化剧烈的区域,对应的频率值较高。
图像的频谱是图像灰度变化强度的指标,是灰度在平面空间中的梯度。 二维傅里叶变换算法的运行速度很慢的,算法的时间复杂度为O(n^ 4)。在实际应用中,由于直接计算二维离散傅里叶变换的计算量较大,通常会采用快速傅里叶变换(Fast Fourier Transform, FFT)算法来提高计算效率。FFT算法通过减少不必要的计算来加速DFT的计算过程,是图像处理中常用的傅里叶变换实现方法。此外,在图像处理中,还经常对DFT的结果进行中心化处理(即将频率域的原点移动到矩阵的中心),以便于观察和分析频谱的对称性。中心化后的频谱图通常能够更直观地展示图像的频率分布特征。
如上图右所示,利用快速傅里叶变换并且将低频部分移动到中心。

相关文章:

  • 鸿蒙:1.入门
  • 十大排序:插入/希尔/选择/堆/冒泡/快速/归并/计数/基数/桶排序 汇总(C语言)
  • 【收藏级神丹】Liae384_刘亦菲_直播可用,平衡度最高的原创神丹,独家珍稀资源
  • Kafka集群安装部署
  • 嵌入式linux sqlite3读写demo
  • 【面试题】网络IO模型
  • 从0开始学习pyspark--Spark DataFrame数据的选取与访问[第5节]
  • jmeter-beanshell学习1-vars使用获取变量和设置变量
  • go内存返还系统相关代码
  • 001 进程和线程
  • Ruby 环境变量
  • 手写SpringMVC之调度器DispatcherServlet
  • Web3 ETF的主要功能
  • 开源205W桌面充电器,140W+65W升降压PD3.1快充模块(2C+1A口),IP6557+IP6538
  • docker pull 镜像的时候遇到Pulling fs layer问题
  • 【译】JS基础算法脚本:字符串结尾
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • Android系统模拟器绘制实现概述
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • download使用浅析
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • JavaScript 基本功--面试宝典
  • Java比较器对数组,集合排序
  • JS 面试题总结
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • React-Native - 收藏集 - 掘金
  • ReactNative开发常用的三方模块
  • React中的“虫洞”——Context
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • 从输入URL到页面加载发生了什么
  • 记一次和乔布斯合作最难忘的经历
  • 技术:超级实用的电脑小技巧
  • 配置 PM2 实现代码自动发布
  • 使用API自动生成工具优化前端工作流
  • 一个项目push到多个远程Git仓库
  • ionic入门之数据绑定显示-1
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #Lua:Lua调用C++生成的DLL库
  • (1)Jupyter Notebook 下载及安装
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (C语言)字符分类函数
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (十八)三元表达式和列表解析
  • (一)RocketMQ初步认识
  • (原)本想说脏话,奈何已放下
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .cfg\.dat\.mak(持续补充)
  • .gitignore文件忽略的内容不生效问题解决
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET序列化 serializable,反序列化
  • .NET与 java通用的3DES加密解密方法
  • .sdf和.msp文件读取