数字图像处理【8】频域滤波1—关于傅里叶

news2024/9/21 2:44:46

这一章是数字图像处理基础的最后一章。系统的介绍傅里叶级数、傅里叶变换、离散傅里叶变换,快速傅里叶变换,以及二维傅里叶变换在图像上的应用。

变换的作用

首先我们先来聊聊什么是“变换”?其实在第一章介绍 HSI 颜色模型的时候,我们就用到了变换这一概念。所谓的变换其实就是把同一个物体事件,转换成另外一种形式表达,其过程相互可逆。傅里叶变换也是一样的,为了有效快速对信号中包含的高频/低频分量进行区分的处理,常常需要将原来定义在时域空间的信号,转换成频率域进行加工处理,然后再转换回时域呈现结果。

傅里叶级数

了解变换的作用之后,我们正式介绍第一个概念——傅里叶级数:任何 周期函数 都可以表示为 不同频率 的正弦波sin或者余弦波cos之和的形式,每个正弦项和余弦项都乘以不用的系数。关键在于如何找到sin和cos对应的系数。

以上图示为傅里叶级数的数学定义。其实就是用数学的公式表示其定义,从右边的三个小图abc,图b是一个时域图(横坐标是t)它可以看成是由图a里面三个不同频率的信号叠加而成,而图c就是图a的频谱变换图,以频率为横坐标,振幅为纵坐标。由此可以总结,傅里叶级数由两个关键内容组成:

  1. 我们可以知道原始输入信号里包含了多少种不同频率ω的分信号。
  2. 还可以知道每一个频率下的对应的振幅A有多大。

那么为什么傅里叶级数是成立的呢?或者是说,为什么 周期函数 都可以表示为 不同频率 的正弦波sin或者余弦波cos之和的形式?其实这里是利用了三角函数函数的正交性特性。什么是正交性,举例子说:单位向量A1自己乘以自己的时候结果是1(内积 A1·A1=1),两个互相垂直的单位向量A1·A2 = 0,那么A1和A2相互正交,A1和A2称为标准正交基。利用这一特性,如果原始输入的周期函数具有频率ω成分,那么单独使用频率ω的正余弦波相乘,就会剩余频率ω分量的波形(A1·A1=1),滤去其他波形(A1·A2= 0)。

傅里叶变换

那么傅里叶级数好似只能处理 周期性函数,现实上大部分的信号都应该是属于非周期的,那么非周期函数它就没折了是不?由此我们正式介绍傅里叶变换,或者严谨点的说法叫 连续傅里叶变换。为了说明傅里叶变换,我们需要从另外一个公式说起,欧拉公式。

在复变函数中,e^(iθ)=(cosθ + i·sinθ) 称为欧拉公式,e是自然对数,i 是虚数的单位。也可以参考上图,横坐标为自然数的单位1,纵坐标为虚数的单位 i,那么任意圆上点A,它的横坐标就是cosθ乘以单位1,纵坐标就是sinθ乘以单位i,所以A可以写作(1·cosθ,i·sinθ)也可以写成A = cosθ + i·sinθ。如果我们把θ写成 θ = ω · t,ω为频率t为时间,那么顺着时间t的变大,A点绕着这个圆圈在逆时针的转动,那么欧拉公式与时间t三维展开就会呈现一种类似弹簧被拉长的画面,如下图所示。

 那么欧拉公式

e^(iθ) = e^(i·ω·t) = (cos ω·t + i·sin ω·t)

代表随着时间 t 变化,e^(i·ω·t) 每时每刻都可以由一组正交基组合来表达。有了这个公式成立之后,我们就可以对一个非周期函数进行傅里叶变换了。对于一个非周期函数,可以看作成是一个周期无穷大的周期函数,按照傅里叶级数展开,也是可以分成很多个不同频率的信号,那么我们如何去分别开呢。

根据三角函数标注正交基的含义,频率ω的正弦信号,用sin(ω·t)去相乘就可以提取出来,而其他非ω信号就会全变成0。所以我们就可以在时间 t 的 [-∞, +∞]范围内,对信号乘以 e^(i·ω·t),写成积分的形式就是以下公式:

F(t) = ∫ [-∞, +∞] f(t) · e^(i·ω·t) dt(ω≠0)
利用欧拉公式可以转变成

F(t) = ∫ [-∞, +∞] f(t) · (cos ωt+i·sin ωt) dt

对应的复数形式就是

Fourier·Transform = ∫ [-∞, +∞] f(t)·(cos ωt) dt  -  ∫ [-∞, +∞] f(t)·(sin ωt) dt

(注意后边的复数 i 部分从时间t积分中提取,复数内积后取负号)

根据三角函数标注正交基的含义,以上公式求解释式就分成两个:当含有频率为ω的信号时候,结果不为0,当不含有频率为ω的信号时候,结果为0。以上公式就可以称为 信号 f(t) 的傅里叶变换F(ω),这和傅里叶级数又有什么关系了?显然傅里叶级数可以利用欧拉公式变换成只有一个级数Cn和自然对数e的i·ω·t次幂的写法,即f(x) = ∫ [-∞, +∞]  Cn·e^(i·ω·t) dt

从公式上可以了解到,傅里叶级数的频谱是不连续的数学代数表示,而傅里叶变换的是随时间而连续的函数表示。

离散傅里叶变换

上面介绍的连续傅里叶变换从理论上处理了自然界中的信号波,但是在计算机中只能处理离散的数字信号。所以说我们需要对模拟信号进行数字化采样,这就离不开奈奎斯特采样定理。简单来说就是用模拟信号中最长周期的2倍的采样率进行采样,才能准确把模拟信号数字化。

而且在傅里叶变换当中,时域和频域都是被看作周期无限长的序列。无限长序列在计算机运算仍然是无法实现。为此必须取有限长序列来建立其时域离散和频域离散的对应关系。基于以上这两点,离散傅里叶变换正式登场。

 现实普遍的情况是,一个连续的周期函数f(x),用傅里叶级数表示法就是

f(x) = ∑(-∞,+∞)  Ck·e^(i·k·x)

现将其进行数字化进行等距离采样,得出N个采样点f(0 ~ N-1)通过这N个采样点,如何确定傅里叶级数Ck?显然如果只提供N个采样点,那是没有办法找出所有的Ck,需要提供满足奈奎斯特采样定理的一个完整周期的采样点,才能找出所有的Ck,但是傅里叶是一个无限长周期函数,更不可能提供无限多个采样点,那怎么办?这个就是离散傅里叶变换面对的一个问题。

我们可以假设(N为采样点个数,n为具体采样序号,T为周期)已提供可知的这N个f(n)采样点,看作是一个周期内T=2Pi的 f(x) 的所有函数值,在这一个周期内的这N个点的坐标就已知,可以写成 n·2Pi / N(如上图示)需要注意的是,按照假设这N个点(n∈0 ~ N-1)是不包含 t 取 2Pi 的f(x)值,它是下一个周期的开始点,也就是说 t 取0*T的f(x)值应该等于 t 取1*T的f(x)值(周期函数收敛)

那么时域取 n = 1 的 x 值 1*2Pi / N,代入 f(x) 其傅里叶级数展开的如上图所示,红色的取值,就是傅里叶级数下标k从(-∞,+∞) 的取值(注意区分时域的采样点n∈[0 ~ N-1])。为了描述方便,我们设定 w = e^(i·2Π / N)

那么还记得傅里叶变换当中的欧拉圆?原来假设的在一个周期范围内的采样个数N=8,在(-∞,+∞) 范围内的傅里叶变换中的频域,傅里叶级数 k 也符合其周期性的特性!有了这个特性我们其实可以把无限个傅里叶级数进行简单的合并同类项,最后合并成k=8项的傅里叶级数和。那么离散傅里叶变换的问就变成了求解这N个基的加权系数,不再需要针对无限个傅里叶级数了。

我们再继续研究离散傅里叶级数的权重系数还有什么特性。取 n = 2 的 x 值 2*2Pi / N。我们利用上方给定的  w = e^(i·2Π / N) 进行简写。

对比取 n = 1 的 x 值 1*2Pi / N。其傅里叶级数的权重系数是一致的,但是 w 变为原来的n次方,而且超出范围的 w^2(N-1)次幂也不用害怕,从上面分析得出的结论“傅里叶级数 k 也符合其周期性的特性”也是可以求出 w^2(N-1)次幂也就等于w^(N-1)。  也就是说,这N个f(n)采样值都可以用 w^1,w^2,w^3,……w^(N-1)这N个傅里叶级数和来表示。

接下来就很关键了,N是采集个数,f(n)是采样值(n∈[0 ~ N-1]),都是可知的,那么w^1,w^2,w^3,……w^(N-1)也是可求的。那么f(n)和w^1,w^2,w^3,……w^(N-1)就可以写出N个N元一次方程。那是不是就可以矩阵求解?上一章才聊完的最小二乘法矩阵求解,这个比最小二乘还简单,只需要一个求逆就可以算出Ck的矩阵了。

​还需要注意的是,如果采样点大于或小于原函数的真正周期,傅里叶级数矩阵会有什么表现呢?其实从上面分析的,组成 w 基权重的傅里叶级数和,我们可以稍微的知道,以w⁰为例,他的权重是(C0+CN +C-N +C2N +C-2N +···)谈若采样个数小于真实周期,那么我们就会误把下个周期的傅里叶级数增加进来。

上面是一个具体的例子,f(x) = 1 + e^ix + e^i2x + e^i3x,级数有4个分别都是1,如果采样个数N=3,那离散傅里叶就会把周期当成3,把C(0+T)当成CN,进而导致傅里叶矩阵的第一个解析解为2,但随着采样个数的增大,这个错误解会得到及时的纠正。

下一章我们探讨快速傅里叶变换 和 傅里叶变换在二维图像上的应用。

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

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

相关文章

数据库工具——mongostat

参考文档:mongostat​​​​​​​​​​​ mongostat提供了当前运行的mongod或者mongos实例的大概状态。mongostat有点类似Linux的vmstat,但mongostat提供的是mongod或者mongos实例的信息。 从MongoDB 4.4开始,mongostat现在与MongoDB Ser…

第五章——动态规划1

背包问题 01背包问题 有N个物品和容量是V的背包,每个物品有价值vi和权重(价值)wi属性,每件物品只能用一次(要么用0次,要么用1次),在背包能装得下的情况下,挑一部分物品装…

网络原理(四):传输层协议 TCP/UDP

目录 应用层 传输层 udp 协议 端口号 报文长度(udp 长度) 校验和 TCP 协议 确认应答 超时重传 链接管理 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答 总结 我们第一章让我们对网络有了一个初步认识,第二章和第三章我们通…

bounding box线性回归

#bounding box regression原理 如图所示绿色框为飞机的Ground Truth(GT),红色为提取的positive anchors,即便红色的框被分类器识别为飞机,但是由于红色的框定位不准,这张图相当于没有正确的检测出飞机。所以我们希望采用一种方法对…

MQTT协议 详解

文章目录 一、啥是MQTT?1. MQTT协议特点2. 发布和订阅3. QoS(Quality of Service levels)QoS 0 —— 最多1次QoS 1 —— 最少1次QoS 2 —— 只有1次 二、MQTT 数据包结构1. MQTT固定头2. MQTT可变头 / Variable header3. Payload消息体 三、M…

Redis集群常用命令及说明

一、集群的特点 1、集群架构特点 (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽; (2)节点的fail是通过集群中超过半数的节点检测失效时才生效…

2023年5月广州/东莞/深圳产品经理认证NPDP招生简章

产品经理国际资格认证NPDP是新产品开发方面的认证,集理论、方法与实践为一体的全方位的知识体系,为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会(PDMA)成立于1979年,是…

7.Shuffle详解

1.分区规则 ps."&"指的是按位与运算,可以强制转换为正数 ps."%",假设reduceTask的个数为3,则余数为0,1,2正好指代了三个分区 以上代码的含义就是对key的hash值强制取正之后,对reduce的个数取…

《可穿戴环形生物阻抗装置连续无袖血压监测》阅读笔记

目录 一、论文简介 二、十个问题 参考文献 一、论文简介 本文提出了一种基于环形生物阻抗传感器的连续无袖血压监测方法。该方法利用可穿戴环形生物阻抗装置实现连续无袖血压监测,并通过优化电极与皮肤接触点来提高信号灵敏度。实验结果表明,该方法可…

【动态规划】背包问题

目录 一:思路简介 二:0-1 背包 三:完全背包 四:多重背包 五:分组背包 一:思路简介 n 个物品,容量为V的背包 Vi 体积 Wi 价值(权重) 二:0-1 背包 每件物品最多只能用1次(要么0次&…

给httprunnermanager接口自动化测试平台加点功能(一)

文章目录 一、背景1.1、部署过程略二、使用过程2.1、新增接口列2.2、实现搜索效果三、总结 一、背景 https://github.com/httprunner/HttpRunnerManager.git从github上找的接口测试平台,引入公司作为测试协同测试的平台,底层框架基于httprunner(requests…

【单目标优化算法】杂草优化算法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

这些使用工具大推荐,现在知道不晚

1.Snip Snip是一款截图软件,它突出的优点就是可以制作滚动截图。 例如:对整个网页进行截图,使用Snip即可轻松获取,无需处理水印。 2.Sleep Cycle 快节奏、高压力的生活导致我们越来越晚睡觉,睡眠质量越来越差。 想提…

Python学习9:对指定r计算圆的面积(python123)

平台:python123 题目描述: 编写函数getCircleArea(r),对给定的参数r计算圆的面积,并返回首先读入n(n>0),然后依次读入n个半径r1,r2,...,rn,以这些半径为参数依次调用getCircleArea函数,得到对应圆的面…

3.动态规划(0x3f:从周赛中学算法 2022下)

来自0x3f 【从周赛中学算法 - 2022 年周赛题目总结(下篇)】:https://leetcode.cn/circle/discuss/WR1MJP/ 【【灵茶山艾府】2022 年周赛题目总结(上篇)】https://leetcode.cn/circle/discuss/G0n5iY/ 学习动态规划是否…

( 栈和队列) 503. 下一个更大元素 II ——【Leetcode每日一题】

❓503. 下一个更大元素 II 难度:中等 给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字…

为何越来越多人不喜欢“试用期六个月”的公司?网友:感觉不靠谱

众所周知,任何一份工作都有试用期,一般是三月左右。但如果你遇到试用期达到半年的公司,你会不会进入? 近日,就有人遇到了此类公司,并对是否要进入该公司犹豫不决。他在论坛上发帖求助:大家是怎…

京城、京味、京韵:从一台服务器看数字北京

北京,既是首善之都,也是数字化创新之城。 早在1999年,北京就基于整座城市的信息化建设方案,率先提出了“数字北京”。后来,数字北京的魅力在奥运会期间大放异彩,受到了全球高度认可。如今,数字经…

【Python】【进阶篇】10、Django中间件

目录 Django中间件1. Django默认自带中间件1)中间的执行与响应顺序2)在调用视图之前3)在调用视图之后 2. 中间件的作用总结 Django中间件 中间件是一个插件系统,嵌入在 Django 的 Request 和 Response 之间执行,可以对…

使用@Bean注解指定初始化和销毁的方法

bean的生命周期 通常意义上讲的bean的生命周期,指的是bean从创建到初始化,经过一系列的流程,最终销毁的过程。只不过,在Spring中,bean的生命周期是由Spring容器来管理的。在Spring中,我们可以自己来指定be…