fft2函数python fft2函数参数

如何使用fft函数进行编程序和进行快速傅里叶逆变换在图象处理fft2函数python的广泛应用领域中fft2函数python , 傅立叶变换起着非常重要的作用fft2函数python,具体表现在包括图象分析、图象增强及图象压缩等方面 。
fftshift的作用正是让正半轴部分和负半轴部分的图像分别关于各自的中心对称 。因为直接用fft得出的数据与频率不是对应的,fftshift可以纠正过来 。
假设f(x,y)是一个离散空间中的二维函数 , 则该函数的二维傅立叶变换的定义如下fft2函数python:
p=0,1…M-1 q=0,1…N-1 (1)
或p=0,1…M-1q=0,1…N-1(2)
离散傅立叶反变换的定义如下fft2函数python:
m=0,1…M-1 n=0,1…N-1(3)
F(p,q)称为f(m,n)的离散傅立叶变换系数 。这个式子表明 , 函数f(m,n)可以用无数个不同频率的复指数信号和表示,而在频率(w1 , w2)处的复指数信号的幅度和相位是F(w1,w2) 。
2、MATLAB提供的快速傅立叶变换函数
(1)fft2
fft2函数用于计算二维快速傅立叶变换 , 其语法格式为:
B = fft2(I)
B = fft2(I)返回图象I的二维fft变换矩阵,输入图象I和输出图象B大小相同 。
例如,计算图象的二维傅立叶变换,并显示其幅值的结果,如图所示,其命令格式如下
load imdemos saturn2
imshow(saturn2)
B = fftshift(fft2(saturn2));
imshow(log(abs(B)),[],'notruesize')
(2)fftshift
MATLAB提供的fftshift函数用于将变换后的图象频谱中心从矩阵的原点移到矩阵的中心,其语法格式为:
B = fftshift(I)
对于矩阵I,B = fftshift(I)将I的一、三象限和二、四象限进行互换 。
(2)ifft2
ifft2函数用于计算图象的二维傅立叶反变换 , 其语法格式为:
B = ifft2(I)
B = ifft2(A)返回图象I的二维傅立叶反变换矩阵,输入图象I和输出图象B大小相同 。其语法格式含义与fft2函数的语法格式相同,可以参考fft2函数的说明 。
如果信号是二维的,用上面的函数即可!直接调用 。
如果信号是一维的,给你下面的例子,你应该能明白!
clear
fs=100;N=128;%采样频率和数据点数
n=0:N-1;t=n/fs;%时间序列
x=0.5*sin(2*pi*15*t) 2*sin(2*pi*40*t); %信号
y=fft(x,N);%对信号进行快速Fourier变换 , 逆变换函数为ifft
mag=abs(y);%求得Fourier变换后的振幅
f=n*fs/N;%频率序列
subplot(2,2,1),plot(f,mag);%绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=128');grid on;
subplot(2,2,2),plot(f(1:N/2),mag(1:N/2)); %绘出Nyquist频率之前随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=128');grid on;
%对信号采样数据为1024点的处理
fs=100;N=1024;n=0:N-1;t=n/fs;
x=0.5*sin(2*pi*15*t) 2*sin(2*pi*40*t); %信号
y=fft(x,N);%对信号进行快速Fourier变换
mag=abs(y);%求取Fourier变换的振幅
f=n*fs/N;
subplot(2,2,3),plot(f,mag); %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=1024');grid on;
subplot(2,2,4)
plot(f(1:N/2),mag(1:N/2)); %绘出Nyquist频率之前随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=1024');grid on;
图片处理-opencv-12.图像傅里叶变换 傅里叶变换(Fourier Transform,简称FT)常用于数字信号处理,它的目的是将时间域上的信号转变为频率域上的信号 。随着域的不同,对同一个事物的了解角度也随之改变,因此在时域中某些不好处理的地方,在频域就可以较为简单的处理 。同时,可以从频域里发现一些原先不易察觉的特征 。傅里叶定理指出“任何连续周期信号都可以表示成(或者无限逼近)一系列正弦信号的叠加 。”
傅里叶变换可以应用于图像处理中 , 经过对图像进行变换得到其频谱图 。从谱频图里频率高低来表征图像中灰度变化剧烈程度 。图像中的边缘信号和噪声信号往往是高频信号 , 而图像变化频繁的图像轮廓及背景等信号往往是低频信号 。这时可以有针对性的对图像进行相关操作,例如图像除噪、图像增强和锐化等 。
Numpy中的fft模块,相关函数如下:
Numpy中的 FFT包提供了函数 np.fft.fft2()可以对信号进行快速傅里叶变换 , 其函数原型如下所示 , 该输出结果是一个复数数组(Complex Ndarry) 。
fft2(a, s=None, axes=(-2, -1), norm=None)
频率分布图谱 , 其中越靠近中心位置频率越低,越亮(灰度值越高)的位置代表该频率的信号振幅越大
傅里叶逆变换,是傅里叶变换的逆操作,将频谱图像转换为原始图像的过程 。通过傅里叶变换将转换为频谱图,并对高频(边界)和低频(细节)部分进行处理,接着需要通过傅里叶逆变换恢复为原始效果图 。频域上对图像的处理会反映在逆变换图像上,从而更好地进行图像处理 。
【fft2函数python fft2函数参数】 图像逆傅里叶变换主要使用的函数如下所示:
OpenCV 中相应的函数是cv2.dft()和用Numpy输出的结果一样,但是是双通道的 。第一个通道是结果的实数部分,第二个通道是结果的虚数部分,并且输入图像要首先转换成 np.float32 格式 。其函数原型如下所示:
dst = cv2.dft(src, dst=None, flags=None, nonzeroRows=None)
由于输出的频谱结果是一个复数,需要调用cv2.magnitude()函数将傅里叶变换的双通道结果转换为0到255的范围 。其函数原型如下:
cv2.magnitude(x, y)
OpenCV 中,通过函数cv2.idft()实现傅里叶逆变换,其返回结果取决于原始图像的类型和大小,原始图像可以为实数或复数 。其函数原型如下所示:
dst = cv2.idft(src[, dst[, flags[, nonzeroRows]]])
傅里叶变换的目的并不是为了观察图像的频率分布(至少不是最终目的),更多情况下是为了对频率进行过滤,通过修改频率以达到图像增强、图像去噪、边缘检测、特征提取、压缩加密等目的 。
过滤的方法一般有三种:低通(Low-pass)、高通(High-pass)、带通(Band-pass) 。
高通滤波器是指通过高频的滤波器,衰减低频而通过高频,常用于增强尖锐的细节,但会导致图像的对比度会降低 。该滤波器将检测图像的某个区域 , 根据像素与周围像素的差值来提升像素的亮度 。
低通滤波器是指通过低频的滤波器 , 衰减高频而通过低频 , 常用于模糊图像 。低通滤波器与高通滤波器相反,当一个像素与周围像素的插值小于一个特定值时,平滑该像素的亮度,常用于去燥和模糊化处理 。
计算机视觉 图像的傅里叶变换 傅里叶基础
法国数学家吉恩·巴普提斯特·约瑟夫·傅里叶被世人铭记的最大的贡献是:他指出任何周期函数都可以表示为不同频率的正弦和/或余弦之和的形式,每个正弦项和/或余弦项乘以不同的系数(现在称该和为傅里叶级数) 。无论函数多么复杂,只要它是周期的 , 并且满足某些适度的数学条件 , 都可以用这样的和来表示 。即一个复杂的函数可以表示为简单的正弦和余弦之和 。甚至非周期函数(单该曲线下的面积是有限的)也可以用正弦和/或许·余弦乘以加权函数的积分来表示 。在这种情况下的公式就是傅里叶公式 。
比如说我们以制作一个饮料的过程 , 使用时域的角度来看就是这样:
这里是什么意思呢 , 就是说一个饮料的制作需要在18点整放1个单位冰糖、3个单位红豆、2个单位的绿豆、4个单位的西红柿 , 还有1个单位的纯净水 。然后再18:01分只需要假如一个单位的纯净水 。后面也是一致 。而频域是怎么描述这件事的呢?
具体来说就是说他发现了一个规律 , 就是说这个制作过程,每分钟都要加入冰糖,每两分钟都要加入红豆,每三分钟都要加入一次绿豆… 。对于时域角度我们这样描述 。
对于频域角度我们这样描述这件事,用直方图表示就是:
如果要考虑更精准的时间精度,我们就要引入相位这个概念 。他是一个和时间差有关的一个表述 。
这里我们说明一下就是时域和频域的表述是互逆的,对于时域我们是时间为横坐标,振幅为纵坐标 。对于频域我们以频率为横坐标,振幅为纵坐标 。但是可以看得出来频域的表述更加简单 , 但是比较抽象,不容易理解 。傅里叶说:任何连续周期信号,可以由一组适当的正弦曲线组合而成 。注意这里是一组而不是一个 。比如对于这样的一个图像:f(x)=3np.sin(0.8x) 7np.sin(1/3x) 2np.sin(0.2x)
看上去是毫无规律可言吧,但是它也可以由一组正弦函数组成 。
他们是可逆的,想不到吧,乱七八糟的东西也有规律了 。但是他们就是这样组合而成的吗?不可能吧 , 所以这里就是不是同时开始的一组余弦函数 , 在叠加时要体现开始的时间 。也就说组合的函数他们的开始时间是不一样的 。在这里分别对应0,2,3.看公式就看出来啦 。这里多说一嘴就是说傅里叶变换从时域角度来看,这个世界是动态的!从频域角度来看这个世界是静止的 。从数学角度来讲:傅里叶变换将一个任意的周期函数分解成为无穷个正弦函数的和的形式 。从物理角度来讲:傅里叶变换实现了将信号从空间域到频率域的转换 。
傅里叶基础numpy实现
python是可以实现傅里叶变换的 , 这里就要说到三剑客的numpy了 。对应的函数是:numpy.fft.fft2返回一个复数数组(complex ndarray) 。numpy.fft.fftshift这个函数时表示把将零频率分量移到频谱中心 。
还要设置频谱的范围20*np.log(np.abs(fshift)),对于图像来说就是255了 。
结果是:
原图和频谱图像 。
逆傅里叶numpy实现
对于傅里叶的逆操作这里没有什么可说的,就是把频域图像转回原图像 。
函数是:numpy.fft.ifft2,那么还有一个操作就是把中间移动回去对啊 。numpy.fft.ifftshift。iimg = np.abs(逆傅里叶变换结果)而第二个图就表示低频部分,边缘就表示为高频部分 。
首先我们要进行傅里叶变换吧 , 才可以进行逆操作 。结果是:
完全一致?。。?
Python科学计算——复杂信号FFTFFT (Fast Fourier Transform, 快速傅里叶变换) 是离散傅里叶变换的快速算法,也是数字信号处理技术中经常会提到的一个概念 。用快速傅里叶变换能将时域的数字信号转换为频域信号,转换为频域信号后我们可以很方便地分析出信号的频率成分 。
当我们把双频信号FFT示例中的 fft_size 的值改为 2**12 时,这时,基频为 16Hz,不能被 1kHz整除,所以 1kHz 处发生了频谱泄露,而它能被 4kHz 整除 , 所以 4kHz 可以很好地被采样 。
由于波形的前后不是连续的,出现波形跳变,而跳变处有着非常广泛的频谱,因此FFT的结果中出现了频谱泄漏 。
为了减小FFT所截取的数据段前后的跳变 , 可以对数据先乘以一个窗函数,使得其前后数据能平滑过渡 。常用的hanning窗函数的定义如下:
50Hz 正弦波与hann窗函数乘积之后的重复波形如下:
我们对频谱泄漏示例中的1kHz 和 4kHz 信号进行了 hann 窗函数处理,可以看出能量更加集中在 1kHz 和 4kHz,在一定程度上抑制了频谱泄漏 。
以 1kHz 三角波为例,我们知道三角波信号中含有丰富的频率信息 , 它的傅里叶级数展开为:
当数字信号的频率随时间变化时,我们称之为扫频信号 。以频率随时间线性变化的扫频信号为例,其数学形式如下:
其频率随时间线性变化,当我们在 [0,1] 的时间窗口对其进行采样时,其频率范围为 0~5kHz 。当时间是连续时 , 扫频信号的频率也是连续的 。但是在实际的处理中,是离散的点采样 , 因此时间是不连续的,这就使扫频信号的快速傅里叶变换问题退化为多点频信号快速傅里叶变换问题 。其快速傅里叶变换得到的频谱图如下所示:
以 50Hz 正弦信号相位调制到 1kHz 的信号为例,其信号形式如下:
它的时域波形,频率响应和相位响应如下图所示:
以扫频信号为例,当我们要探究FFT中的能量守恒时,我们要回归到信号最初的形式:
【20分】python (x, y) 运行.py文件总是出错Traceback (most recent call last):
File "C:\Users\zhangjq058\workspace\22222222\src\222.py", line 20, in module
x, y = meshgrid(fftfreq(th.shape, dx), fftfreq(th.shape, dx))
File "C:\Python27\lib\site-packages\numpy\fft\helper.py", line 153, in fftfreq
assert isinstance(n,types.IntType) or isinstance(n, integer)
AssertionError
我的code如下:
from pylab import *
from numpy import *
N = 100 #lattice points per axis
dt = 1 #time step
dx = 1 #lattice spacing
t = arange(0, 10000*dt, dt) #time
a = 1 #cofficient
epsilon = 100 #cofficient
M = 1.0 #cofficient
every = 100 #dump an image every
phi_0 = 0.5 #initial mean value of the order parameter
noise = 0.1 #initial amplitude of thermal fluctuations in the order parameter
th = phi_0*ones((N, N))noise*(rand(N, N) - 0.5) #initial condition
x, y = meshgrid(fftfreq(th.shape, dx), fftfreq(th.shape, dx))
k2 = (x*xy*y) #k is a victor in the Fourier space, k2=x^2 y^2
g = lambda th, a: 4*a*th*(1-th)*(1-2*th) #function g
def update(th, dt, a, k2):
return ifft2((fft2(th)-dt*M*k2*fft2(g(th,a)))/(1 2*epsilon*M*dt*k2**2))
for i in range(size(t)):
print t
if mod(i, every)==0:
imshow(abs(th), vmin=0.0, vmax=1.0)
colorbar()
savefig('t' str(i/every).zfill(3) '.png', dpi=100)
clf()
th=update(th, dt, a, k2)
python 二维FFT二维FFT常用在图像处理上 , 首先要能理解二维FFT的意义,否则很难明白它到底是怎么工作的 。
第一列是原图和对应的频率信息,第二列是去除低频部分后,FFT逆变换得到的图像 。第三列是去除高频部分后FFT逆变换得到的图像 。
从第二列可以看出高频贡献了图像的细节 。从白到黑的边界保留了下来 。而原图中大片的白与大片的黑在这个图中没什么区别 。
第三列中保留了原图中的亮部与灰部,而由黑到白的临界线却很模糊 。细小的白线黑线也没能显示 。所以低频贡献了图像的明暗 。
2.工作原理理解
二维FFT就是先对行做次一维FFT , 这样每个元素都是关于行频率信息了,然后再对列做一维FFT,这样每个元素都包含了行和列的频率信息 。每个元素都是个复数,取绝对值可得到振幅 , 从实部与虚部的比值可等到相位,在二维矩阵的位置信息包含了频率大小和方向 。方向在一维FFT中是不用考虑的 。
FFT2的结果也是正频率从0到高然后负频率从高到0.fftshift()之后会将低频放到中间位置 。
第一幅图的频谱是中间一条白线,也就是说许多个正弦波沿横向传播 。纵向上没有变化 。
第三幅图的频谱是十字形加一条从左下角到右上角的直线 。说明原图在横向,纵向都有变化,变化的方向从左下角到右上角 。
从中心到频谱图上某一点构成的向量方向就是这个波传播的方向 。
正负对称才能消除虚部,这点与一维FFT原理一致 。
关于fft2函数python和fft2函数参数的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读