精华内容
下载资源
问答
  • 傅里叶变换与逆变换的关系
    千次阅读
    2022-04-23 08:38:14

    傅里叶变换与逆变换

    MATLAB代码如下

    RGB=imread('autumn.tif');%读取图像
    figure; 
    subplot(2,2,1);
    imshow(RGB);
    title('彩色原图');
    
    a=rgb2gray(RGB); %灰度化
    subplot(2,2,2);
    imshow(a);
    title('灰度图');
    
    subplot(2,2,3);
    b=dct2(a);%离散傅里叶变换
    imshow(log(abs(b)),[]);
    colormap(hot(9)),colorbar;%配色
    title('DCT变换结果'); 
    
    % idct离散傅里叶反变换
    subplot(2,2,4);
    b(abs(b)<10)=0; 
    c=idct2(b)/255; 
    imshow(c);
    title('IDCT变换结果');
    

    处理结果

    实验结果

    更多相关内容
  • 离散傅里叶级数,离散傅里叶变换逆傅里叶变换的实现。
  • 图像处理:用python实现二维傅里叶变换、逆变换以及两张图片幅度谱相位谱交换,大家可以换图片试一下效果,相位谱对恢复图像的贡献较大,上课所学一致
  • 可轻松实现短时傅里叶变换及对应逆变换,可更改程序内部窗函数,自行选择合适窗函数进行分析
  • 对振动加速度信号进行逆傅里叶变换,支持Excel和text读取,希望大家批评指正
  • 傅里叶变换FFT和逆傅里叶变换IFFT 欢迎大家喜欢
  • 傅里叶变换就是将信号时域转化为频域的过程,本文用程序实现对二维图像的傅里叶变换与逆变换!首先需要知道一维傅里叶变换!⬇️⬇️⬇️ ## 1.1 一维傅里叶变换 一维傅里叶变换的过程如下方动图所示:

    ✨博客主页:米开朗琪罗~🎈
    ✨博主爱好:羽毛球🏸
    ✨年轻人要:Living for the moment(活在当下)!💪
    🏆推荐专栏:【图像处理】【千锤百炼Python】【深度学习】【排序算法

    😺一、知识储备

    傅里叶变换就是将信号时域转化为频域的过程,本文用程序实现对二维图像的傅里叶变换与逆变换!首先需要知道一维傅里叶变换!⬇️⬇️⬇️

    🐶1.1 一维傅里叶变换

    一维傅里叶变换的过程如下方动图所示:
    在这里插入图片描述
    就像上面动图所示一样,一维的波可以用许多的正弦波叠加表示,这就是一维傅里叶变换的关键所在。

    🐶1.2 二维傅里叶变换

    这里引用一张知乎博主的图,十分通透!!!!!!

    先贴上引用,尊重创作者!

    https://zhuanlan.zhihu.com/p/99605178

    在这里插入图片描述
    如何表现🧐🧐🧐我们看!⬇️⬇️⬇️
    在这里插入图片描述
    右边图的每一个点都在描述一个平面波。

    右图中的每一个点:

    • 它到中点的距离描述的是频率;
    • 中点到它的方向是平面波的方向;
    • 那点的灰度值是它的幅值。
      在这里插入图片描述
      通透!!!感谢这位博主的图🏆

    请添加图片描述

    😺二、基于OpenCV的频域变换

    🐶2.1 傅里叶变换

    🦄2.1.1 函数API

    傅里叶变换:

    函数式:out = cv2.dft(src, flag)

    参数介绍:

    • 参数scr:输入图像;
    • 参数flag:转换标识,一般用cv2.DFT_COMPLEX_OUTPUT,即输出一个复数阵列,更多请参考dft
    • 返回值out:复数阵列。

    🦄2.1.2 程序设计

    import cv2
    import matplotlib.pyplot as plt
    import numpy as np
    
    original = cv2.imread(r'C:\Users\Lenovo\Desktop\lena1.jpg', 0)  # 转为灰度图
    
    dft = cv2.dft(np.float32(original), flags=cv2.DFT_COMPLEX_OUTPUT)
    dftShift = np.fft.fftshift(dft)     #  将图像中的低频部分移动到图像的中心
    result = 20 * np.log(cv2.magnitude(dftShift[:, :, 0], dftShift[:, :, 1]))   # 将实部和虚部转换为实部,乘以20是为了使得结果更大
    
    plt.subplot(121), plt.imshow(original, cmap='gray')
    plt.title('original')
    plt.axis('off')
    
    plt.subplot(122), plt.imshow(result, cmap='gray')
    plt.title('fft')
    plt.axis('off')
    plt.show()
    

    🦄2.1.3 结果可视化

    在这里插入图片描述

    🐶2.2 逆傅里叶变换

    🦄2.2.1 程序设计

    import cv2
    import matplotlib.pyplot as plt
    import numpy as np
    
    original = cv2.imread(r'C:\Users\Lenovo\Desktop\lena1.jpg', 0)  # 转为灰度图
    
    dft = cv2.dft(np.float32(original), flags=cv2.DFT_COMPLEX_OUTPUT)
    dftShift = np.fft.fftshift(dft)     # 将图像中的低频部分移动到图像的中心
    result = 20 * np.log(cv2.magnitude(dftShift[:, :, 0], dftShift[:, :, 1]))   # 将实部和虚部转换为实部,乘以20是为了使得结果更大
    
    ishift = np.fft.ifftshift(dftShift)     # 低频部分从图像中心移开
    iImg = cv2.idft(ishift)                 # 傅里叶反变换
    iImg = cv2.magnitude(iImg[:, :, 0], iImg[:, :, 1])      # 转化为空间域
    
    plt.subplot(131), plt.imshow(original, cmap='gray')
    plt.title('original')
    plt.axis('off')
    
    plt.subplot(132), plt.imshow(result, cmap='gray')
    plt.title('fft')
    plt.axis('off')
    
    plt.subplot(133), plt.imshow(iImg, cmap='gray')
    plt.title('ifft')
    plt.axis('off')
    plt.show()
    

    🦄2.2.2 结果可视化

    在这里插入图片描述

    😺三、基于NumPy的频域变换

    🐶3.1 傅里叶变换

    🦄3.1.1 程序设计

    import cv2
    import matplotlib.pyplot as plt
    import numpy as np
    
    original = cv2.imread(r'C:\Users\Lenovo\Desktop\lena1.jpg', 0)  # 转为灰度图
    
    dft = np.fft.fft2(original)
    dftShift = np.fft.fftshift(dft)     # 将图像中的低频部分移动到图像的中心
    result = 20*np.log(np.abs(dftShift))
    
    plt.subplot(121), plt.imshow(original, cmap='gray')
    plt.title('original')
    plt.axis('off')
    
    plt.subplot(122), plt.imshow(result, cmap='gray')
    plt.title('fft')
    plt.axis('off')
    
    plt.show()
    

    🦄3.1.2 结果可视化

    在这里插入图片描述

    🐶3.2 逆傅里叶变换

    🦄3.2.1 程序设计

    import cv2
    import matplotlib.pyplot as plt
    import numpy as np
    
    original = cv2.imread(r'C:\Users\Lenovo\Desktop\lena1.jpg', 0)  # 转为灰度图
    
    dft = np.fft.fft2(original)
    dftShift = np.fft.fftshift(dft)     # 将图像中的低频部分移动到图像的中心
    result = 20*np.log(np.abs(dftShift))
    
    ishift = np.fft.ifftshift(dftShift)     # 低频部分从图像中心移开
    iImg = np.fft.ifft2(ishift)                 # 傅里叶反变换
    iImg = np.abs(iImg)
    
    plt.subplot(131), plt.imshow(original, cmap='gray')
    plt.title('original')
    plt.axis('off')
    
    plt.subplot(132), plt.imshow(result, cmap='gray')
    plt.title('fft')
    plt.axis('off')
    
    plt.subplot(133), plt.imshow(iImg, cmap='gray')
    plt.title('ifft')
    plt.axis('off')
    plt.show()
    

    🦄3.2.2 结果可视化

    在这里插入图片描述

    展开全文
  • 【matlab代码】 对信号进行傅里叶逆变换,并原始信号进行对比.m
  • fft的快速傅里叶变换 // data 长度为 (2 * 2^n), data 的偶位为实数部分, data 的奇位为虚数部分 // isInverse表示是否为逆变换
  • 傅里叶逆变换(IFFT)后得到实数序列-含Matlab程序
  • [Python图像处理六] :Opencv图像傅里叶变换和傅里叶逆变换原理及实现 一、傅里叶变换 1、傅里叶变换原理 2、自定义傅里叶变换功能函数 3、OpenCV库函数实现傅里叶变换 二、傅里叶逆变换 1、傅里叶逆变换原理 2、...

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的、不同方法的处理,以达到对图像进行去噪、锐化等一系列的操作。同时,希望观看本专栏的小伙伴可以理解到OpenCv进行图像处理的强大哦,如有转载,请注明出处(原文链接和作者署名),感谢各位小伙伴啦!

    前文参考:
    《OpenCv视觉之眼》Python图像处理一 :Opencv-python的简介及Python环境搭建
    《OpenCv视觉之眼》Python图像处理二 :Opencv图像读取、显示、保存基本函数原型及使用
    《OpenCv视觉之眼》Python图像处理三 :Opencv图像属性、ROI区域获取及通道处理
    《OpenCv视觉之眼》Python图像处理四 :Opencv图像灰度处理的四种方法及原理
    《OpenCv视觉之眼》Python图像处理五 :Opencv图像去噪处理之均值滤波、方框滤波、中值滤波和高斯滤波

    上次博客,我们讲解了OpenCV图像去噪的几种基本方法,包括均值滤波、中值滤波、高斯滤波等,也就是在图像时域上进行去噪的方法,其中,高斯滤波和中值滤波是需要重点掌握的图像去噪方法,因为对图像的高斯噪声和椒盐噪声去除的效果比较好;除了以上时域上的去噪方法之外,OpenCV也提供了对图像频域上的去噪的函数方法,例如高通滤波和低通滤波,通常用作图像除噪、图像增强和锐化等,因此,高通滤波和低通滤波也是我们学习OpenCV需要掌握的两种图像去噪的方法,但由于高通和低通滤波的实现原理是通过傅里叶变换后进行处理,然后通过傅里叶逆变换进行实现的,所以首先我们需要了解图像傅里叶变换和傅里叶逆变换的原理。

    本次博客,林君学长将带大家了解OpenCV图像的傅里叶变换和逆变换原理,通过原理编写傅里叶变换和逆变换的功能函数,并同时介绍OpenCV傅里叶变换和逆变换的库函数使用方法,一起学习吧!

    在进行傅里叶变换学习时,我们必须要明白为什么要在频率域研究图像增强?

    • 可以利用频率成分和图像外表之间的对应关系。一些在空间域表述困难的增强任务,在频率域中变得非常普通
    • 滤波在频率域更为直观,它可以解释空间域滤波的某些性质
    • 可以在频率域指定滤波器,做反变换,然后在空间域使用结果滤波器作为空间域滤波器的指导
    • 一旦通过频率域试验选择了空间滤波,通常实施都在空间域进行

    提示:傅里叶变换是为后面低通滤波或者说是高通滤波做准备哦,一般来说,处理的是灰度图像,通过上面的介绍我们也可以看出,但下面的原理我们通过处理彩色图像编写的,而OpenCV库函数是在处理灰度图像基础上实现的

    一、傅里叶变换

    • 傅里叶变换(Fourier Transform,FT)后,对同一事物的观看角度随之改变,可以从频域里发现一些从时域里不易察觉的特征。某些在时域内不好处理的地方,在频域内可以容易地处理。

    1、傅里叶变换原理

    1)、什么是傅里叶变换?
    能将满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。在不同的研究领域,傅立叶变换具有多种不同的变体形式,如连续傅立叶变换和离散傅立叶变换。傅里叶变换是一种分析信号的方法,它可分析信号的成分,也可用这些成分合成信号。许多波形可作为信号的成分,比如正弦波、方波、锯齿波等,傅里叶变换用正弦波作为信号的成分。
    傅里叶变换的实质是将一个信号分离为无穷多多正弦/复指数信号的加成,也就是说,把信号变成正弦信号相加的形式——既然是无穷多个信号相加,那对于非周期信号来说,每个信号的加权应该都是零——但有密度上的差别,你可以对比概率论中的概率密度来思考一下——落到每一个点的概率都是无限小,但这些无限小是有差别的所以,傅里叶变换之后,横坐标即为分离出的正弦信号的频率,纵坐标对应的是加权密度。
    在这里插入图片描述
    2)、傅里叶变换作用?
    傅里叶变换可以将一个时域信号转换成在不同频率下对应的振幅及相位,其频谱就是时域信号在频域下的表现,而反傅里叶变换可以将频谱再转换回时域的信号。最简单最直接的应用就是时频域转换。将图像时域处理上面复杂的特征转为频域实现简单化,对简单化的特征进行处理,然后再通过傅里叶逆变换回到原来的图像,如下所示:
    在这里插入图片描述
    3)、图像进行傅里叶变换原理
    我们知道,灰度图像是由二维的离散的点构成的。二维离散傅里叶变换(Two-Dimensional Discrete Fourier Transform)常用于图像处理中,对图像进行傅里叶变换后得到其频谱图。频谱图中频率高低表征图像中灰度变化的剧烈程度。图像中边缘和噪声往往是高频信号,而图像背景往往是低频信号。我们在频率域内可以很方便地对图像的高频或低频信息进行操作,完成图像去噪,图像增强,图像边缘提取等操作,因此,对图像进行傅里叶变换的原理如下公式:
    F ( u , v ) = ∑ x = 0 H − 1 ∑ y = 0 W − 1 f ( x , y ) e − 2 j π ( u x / H + v y / W ) 图 像 高 H , 宽 W 。 F ( u , v ) 表 示 频 域 图 像 , f ( x , y ) 表 示 时 域 图 像 。 u 的 范 围 为 [ 0 , H − 1 ] , v 的 范 围 为 [ 0 , W − 1 ] ↑ F(u,v)=\sum_{x=0}^{H-1}\sum_{y=0}^{W-1}f(x,y)e^{-2j\pi(ux/H+vy/W)} \\\\ 图像高H,宽W。F(u,v)表示频域图像,f(x,y)表示时域图像。u的范围为[0,H-1],v的范围为[0,W-1] ↑ F(u,v)=x=0H1y=0W1f(x,y)e2jπ(ux/H+vy/W)HWF(u,v)f(x,y)u[0,H1]v[0,W1]
    那么怎么将上面的二维公式转为我们可以理解的二维图像呢?其实很简单, f ( x , y ) f(x,y) f(x,y)表示在(x,y)点上的图像的像素值,该像素值乘以后面的在(u,v)点的 e − 2 j π ( u x / H + v y / W ) e^{-2j\pi(ux/H+vy/W)} e2jπ(ux/H+vy/W)处理出来的一个数,然后对图像所有像素进行遍历,最后求和,就得到在频域上该(u,v)点对应的值,通过该原理,我们就可以自己写出傅里叶变换的功能函数了,来看吧

    2、自定义傅里叶变换功能函数

    1)、自定义傅里叶变换函数

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
    #自定义傅里叶变换功能函数
    def dft(img):
        #获取图像属性
        H,W,channel=img.shape
        #定义频域图,从公式可以看出为求出结果为复数,因此,需要定义为复数矩阵
        F = np.zeros((H, W,channel), dtype=np.complex)
        # 准备与原始图像位置相对应的处理索引
        x = np.tile(np.arange(W), (H, 1))
        y = np.arange(H).repeat(W).reshape(H, -1)
        #通过公式遍历
        for c in range(channel):#对彩色的3通道数进行遍历
            for u in range(H):
                for v in range(W):
                    F[u, v, c] = np.sum(img[..., c] * np.exp(-2j * np.pi * (x * u / W + y * v / H))) / np.sqrt(H * W)
        return F
    

    2)、读取图像,进行傅里叶变化并显示变换后的结果

    #读取图像
    img=cv2.imread("my.jpg")
    #进行图像裁剪,加快傅里叶运算速率。将原始尺寸缩放为100*100的尺寸
    img = cv2.resize(img, (100, 100), interpolation=cv2.INTER_CUBIC)
    #BGR转换为RGB显示格式,方便通过matplotlib进行图像显示
    img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    #调用傅里叶变换函数
    result =dft(img)
    #将傅里叶频谱图从左上角移动到中心位置
    fshift = np.fft.fftshift(result)
    #将复数转为浮点数进行傅里叶频谱图显示
    fimg = np.log(np.abs(fshift))
    #图像显示
    plt.subplot(121), plt.imshow(img), plt.title('原图像')
    plt.axis('off')
    plt.subplot(122), plt.imshow(fimg), plt.title('傅里叶变换')
    plt.axis('off')
    plt.show()
    

    在这里插入图片描述
    上图是将原图进行缩放之后进行傅里叶变换的,只为了降低函数运行时间,尽快的得出结果;当然,OpenCV中也提供了图像傅里叶变换的库函数,接下,我们介绍OpenCV中傅里叶库函数的使用!

    3、OpenCV库函数实现傅里叶变换

    OpenCV 中相应的函数是cv2.dft()和用Numpy输出的结果一样,但是是双通道的。第一个通道是结果的实数部分,第二个通道是结果的虚数部分,并且输入图像要首先转换成 np.float32 格式。
    1)、函数原型:img=cv2.dft(src, flags=None, nonzeroRows=None)

    • src表示输入图像,需要通过np.float32转换格式
    • flags表示转换标记,其中DFT _INVERSE执行反向一维或二维转换,而不是默认的正向转换;DFT _SCALE表示缩放结果,由阵列元素的数量除以它;DFT _ROWS执行正向或反向变换输入矩阵的每个单独的行,该标志可以同时转换多个矢量,并可用于减少开销以执行3D和更高维度的转换等;DFT _COMPLEX_OUTPUT执行1D或2D实数组的正向转换,这是最快的选择,默认功能;DFT _REAL_OUTPUT执行一维或二维复数阵列的逆变换,结果通常是相同大小的复数数组,但如果输入数组具有共轭复数对称性,则输出为真实数组
    • nonzeroRows表示当参数不为零时,函数假定只有nonzeroRows输入数组的第一行(未设置)或者只有输出数组的第一个(设置)包含非零,因此函数可以处理其余的行更有效率,并节省一些时间;这种技术对计算阵列互相关或使用DFT卷积非常有用

    注意,由于输出的频谱结果是一个复数,需要调用cv2.magnitude()函数将傅里叶变换的双通道结果转换为0到255的范围
    2)、cv2.magnitude()函数原型:cv2.magnitude(x, y)

    • x表示浮点型X坐标值,即实部
    • y表示浮点型Y坐标值,即虚部

    最终输出结果为幅值,即:

    i m g ( I ) = x ( I ) 2 + y ( I ) 2 img(I)=\sqrt{x(I)^2+y(I)^2} img(I)=x(I)2+y(I)2
    3)、傅里叶库函数使用

    #傅里叶库函数使用
    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
    #读取图像
    img=cv2.imread("my.jpg",0)
    #进行图像裁剪,加快傅里叶运算速率。将原始尺寸缩放为100*100的尺寸
    #OpneCV傅里叶变换函数
    result =cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)#需要将图像进行一次float转换
    #将频谱低频从左上角移动至中心位置
    dft_shift = np.fft.fftshift(result)
    #频谱图像双通道复数转换为0-255区间
    result1 = 20*np.log(cv2.magnitude(dft_shift[:,:,0], dft_shift[:,:,1]))
    #图像显示
    plt.subplot(121), plt.imshow(img,'gray'), plt.title('原图像')
    plt.axis('off')
    plt.subplot(122), plt.imshow(result1,'gray'), plt.title('傅里叶变换')
    plt.axis('off')
    plt.show()
    

    在这里插入图片描述
    使用OpenCV函数需要先将图像转为灰度图,然后才能进行处理,这里林君学长再介绍一个Numpy库的傅里叶变换处理,给出相关代码,小伙伴们自己理解哈,不做说明哦!
    4)、扩展:Numpy库的图像傅里叶变换

    #Numpy傅里叶变换
    import cv2 as cv
    import numpy as np
    from matplotlib import pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
    #读取图像灰度图像
    img = cv.imread('my.jpg',0)
    #快速傅里叶变换算法得到频率分布
    f = np.fft.fft2(img)
    #默认结果中心点位置是在左上角,
    #调用fftshift()函数转移到中间位置
    fshift = np.fft.fftshift(f)       
    #fft结果是复数, 其绝对值结果是振幅
    fimg = np.log(np.abs(fshift))
    #展示结果
    plt.subplot(121), plt.imshow(img,'gray'), plt.title('原图像')
    plt.axis('off')
    plt.subplot(122), plt.imshow(fimg,'gray'), plt.title('傅里叶变换')
    plt.axis('off')
    plt.show()
    

    在这里插入图片描述

    二、傅里叶逆变换

    1、傅里叶逆变换原理

    1)、傅里叶反变换原理就是将图像频域还原为图像时域,具体原理公式如下所示:
    f ( x , y ) = ∑ u = 0 H − 1 ∑ v = 0 W − 1 F ( u , v ) e 2 j π ( u x / H + v y / W ) 图 像 高 H , 宽 W 。 f ( x , y ) 表 示 时 域 图 像 , F ( u , v ) 表 示 频 域 图 像 。 x 的 范 围 为 [ 0 , H − 1 ] , y 的 范 围 为 [ 0 , W − 1 ] ↑ f(x,y)=\sum_{u=0}^{H-1}\sum_{v=0}^{W-1} F(u,v)e^{2j\pi(ux/H+vy/W)} \\\\ 图像高H,宽W。f(x,y)表示时域图像,F(u,v)表示频域图像。x的范围为[0,H-1],y的范围为[0,W-1] ↑ f(x,y)=u=0H1v=0W1F(u,v)e2jπ(ux/H+vy/W)HWf(x,y),F(u,v)x[0,H1]y[0,W1]
    对于公式的理解,和上面傅里叶变换公式理解一致

    2、自定义傅里叶逆变换功能函数

    1)、自定义傅里叶逆变换功能函数

    import cv2 as cv
    import numpy as np
    from matplotlib import pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
    #傅里叶反变换
    def idft(G):
        H, W, channel = G.shape
        #定义空白时域图像
        out = np.zeros((H, W, channel), dtype=np.float32)
        # 准备与原始图像位置相对应的处理索引
        x = np.tile(np.arange(W), (H, 1))
        y = np.arange(H).repeat(W).reshape(H, -1)
        #通过公式遍历
        for c in range(channel):
            for u in range(H):
                for v in range(W):
                    out[u, v, c] = np.abs(np.sum(G[..., c] * np.exp(2j * np.pi * (x * u / W + y * v / H)))) / np.sqrt(W * H)
        # 剪裁
        out = np.clip(out, 0, 255)
        out = out.astype(np.uint8)
        return out
    

    2)、调用函数,先进行傅里叶变换,然后进行傅里叶逆变换并显示结果

    #读取图像
    img=cv2.imread("my.jpg")
    #进行图像裁剪,加快傅里叶运算速率。将原始尺寸缩放为100*100的尺寸
    img = cv2.resize(img, (100, 100), interpolation=cv2.INTER_CUBIC)
    #BGR转换为RGB显示格式,方便通过matplotlib进行图像显示
    img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    #调用傅里叶变换函数,先将图像进行傅里叶变换,该函数上面我们通过原理写出了哦!
    result =dft(img)
    #将傅里叶频谱图从左上角移动到中心位置
    fshift = np.fft.fftshift(result)
    #将复数转为浮点数进行傅里叶频谱图显示
    fimg = np.log(np.abs(fshift))
    #调用傅里叶逆变换函数
    result2=idft(result)
    #图像显示
    plt.subplot(131), plt.imshow(img), plt.title('原图像')
    plt.axis('off')
    plt.subplot(132), plt.imshow(fimg), plt.title('傅里叶变换')
    plt.axis('off')
    plt.subplot(133), plt.imshow(result2), plt.title('傅里叶逆变换')
    plt.axis('off')
    plt.show()
    

    在这里插入图片描述
    最后我们可以看出,我们通过原理书写的傅里叶变换和傅里叶逆变换是没有问题的,因此,而且傅里叶反变换的结果是和之前的图像一模一样的,几乎没有什么损失,后面我们将会讲到在傅里叶变换的基础上实现高通或者说是低通滤波,来对图像去噪,记得收看啦!

    3、OpenCV库函数实现傅里叶逆变换

    OpenCV中也提供了傅里叶逆变换的库函数,我们一起看一下函数原型吧
    1)、函数原型img=cv2.idft(src,flags,nonzeroRows)

    • src表示输入图像,包括实数或复数
    • flags表示转换标记
    • nonzeroRows表示要处理的img行数,其余行的内容未定义

    2)、OpenCV库函数实现傅里叶逆变换的完整代码如下所示:

    #OpenCV实现傅里叶逆变换
    import cv2 as cv
    import numpy as np
    from matplotlib import pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
    
    #读取图像
    img = cv2.imread('my.jpg', 0)
    #傅里叶变换
    dft = cv2.dft(np.float32(img), flags = cv2.DFT_COMPLEX_OUTPUT)#傅里叶变换库函数调用
    dftshift = np.fft.fftshift(dft)#将傅里叶频域从左上角移动到中间
    res1= 20*np.log(cv2.magnitude(dftshift[:,:,0], dftshift[:,:,1]))#双通道结果转换为0到255的范围用于图像显示
    #傅里叶逆变换
    ishift = np.fft.ifftshift(dftshift)#将频域从中间移动到左上角
    iimg = cv2.idft(ishift)#傅里叶逆变换库函数调用
    res2 = cv2.magnitude(iimg[:,:,0], iimg[:,:,1])#双通道结果转换为0到255的范围
    #显示图像
    plt.subplot(131), plt.imshow(img, 'gray'), plt.title('原图像')
    plt.axis('off')
    plt.subplot(132), plt.imshow(res1, 'gray'), plt.title('傅里叶变换')
    plt.axis('off')
    plt.subplot(133), plt.imshow(res2, 'gray'), plt.title('傅里叶逆变换')
    plt.axis('off')
    plt.show()
    

    在这里插入图片描述
    3)、扩展:Numpy库也提供图像了傅里叶变换,完整代码如下所示:

    #Numpy库的傅里叶变换
    import cv2 as cv
    import numpy as np
    from matplotlib import pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
    #读取图像
    img = cv.imread('my.jpg',0)
    #傅里叶变换
    f = np.fft.fft2(img) #Numpy的库函数傅里叶变换
    fshift = np.fft.fftshift(f)
    res = np.log(np.abs(fshift))
    #傅里叶逆变换
    ishift = np.fft.ifftshift(fshift)
    iimg = np.fft.ifft2(ishift) #Numpy的库函数傅里叶逆变换
    iimg = np.abs(iimg)#将复数变为实数
    #展示结果
    plt.subplot(131), plt.imshow(img,'gray'), plt.title('原图像')
    plt.axis('off')
    plt.subplot(132), plt.imshow(res,'gray'), plt.title('傅里叶变换')
    plt.axis('off')
    plt.subplot(133), plt.imshow(iimg,'gray'), plt.title('Inverse Fourier Image')
    plt.axis('off')
    plt.show()
    

    在这里插入图片描述

    以上就是本次博客的全部内容,遇到问题的小伙伴记得留言评论,学长看到会为大家进行解答的,这个学长不太冷!

    任何的收获不是巧合,而是每天的努力与坚持得来的。人生因有梦想,而充满动力。
    不怕你每天迈一小步,只怕你停滞不前;不怕你每天做一点事,只怕你无所事事。 坚持,是生命的一种毅力!执行,是努力的一种坚持!

    陈一月的又一天编程岁月^ _ ^

    展开全文
  • 二维离散傅里叶变换与逆变换的原理与实现(Matlab)

    万次阅读 多人点赞 2020-03-20 20:52:30
    我们已经知道一维噪声可以用一维傅里叶变换到频域滤波,同理二维噪声也可以用二维傅里叶变换到"频率滤波"。 二维傅里叶变换的原理 笔者很讨厌一上来就看到一连串复杂的公式!因此当我看懂一个原理后,我就会用最好...

    前言

    在野外数据采集中,虽然单个仪器采集的是一维信号,但是当把多台仪器数据汇总并生成做二维剖面的图像时,噪声可不只有一维的,更有x,y两个方差同时存在的"二维噪声"!我们已经知道一维噪声可以用一维傅里叶变换到频域滤波,同理二维噪声也可以用二维傅里叶变换到"频率滤波"。

    二维傅里叶正变换的原理

    笔者很讨厌一上来就看到一连串复杂的公式!因此当我看懂一个原理后,我就会用最好理解的方式来重述它,毕竟我更偏重于应用。二维傅里叶变化,只用一个公式:

    公式1:二维傅里叶变换公式(其实不用看它)
    公式中参数说明:

    公式(1)
    公式中参数说明:
    M、N分别是图像的长和宽;
    u、x范围从1到M-1;v、y范围从1到N-1。
    公式看上去不难,但其实还是不太明确到底怎么用啊!它其实可以矩阵相乘的形式表示:
    在这里插入图片描述
    公式(2)
    公式2中f是原始二维数据矩阵,G_{1}和G_{2}分别是如下:
    在这里插入图片描述
    公式(3)
    在这里插入图片描述
    公式(4)
    这用Matlab太好实现了叭!G_{1}和G_{2}这么有规律,很容易就编程出来了~ 然后3个矩阵做个乘积,就换到频率域了!二维傅里叶变换就结束了!

    二维傅里叶反变换

    定义的公式为公式5(不用看),矩阵形式的公式为公式6(看这个即可):
    在这里插入图片描述
    公式5:二维傅里叶反变换公式
    在这里插入图片描述
    公式6:矩阵形式(看这个)
    其中G_{3}和G_{4}矩阵为:
    在这里插入图片描述
    公式(7)
    在这里插入图片描述
    公式(8)
    到此,二维傅里叶逆变换也结束了!整个二维傅里叶变换就都结束了!真的很简单!下面我们就在Matlab中手写实现正、逆这两个过程。

    Matlab程序实现

    首先实现正变换程序,对应Matlab自带函数为:fft2

    clc; clear;
    
    data = imread('zxc.jpg');  % 数据——最好比卷积核的尺寸大
    data = im2double(data); 
    data = rgb2gray(data);     % rgb转为灰度图像
    subplot(1,3,1);
    imshow(data);
    title('原始图像')
    
    zidai = fft2(data);   % matlab自带函数,来用对比
    subplot(1,3,2);
    imshow(real(zidai));  % 一般只要实部
    title('自带的fft2生成的"频域"图像');
    
    size_data = size(data);
    M = size_data(1);  %(原始数据矩阵)的长
    N = size_data(2);  %(原始数据矩阵)的宽
    
    % 下面是傅里叶正变换必备的一些矩阵:
    Wm = exp(-j*2*pi/M);
    Wn = exp(-j*2*pi/N); % 不同G中用不同的W
    Em = zeros(M);
    En = zeros(N);     % E是辅助计算矩阵
    Gm = zeros(M)+Wm;
    Gn = zeros(N)+Wn;  % G是计算时要用的矩阵
    F = zeros(M,N);    % F是转换到频域的结果
    
    % 对Gm的计算: 循环长度为M
    fprintf('二维离散傅里叶变换开始:\n');
    for row = 0:M-1
        for col = 0:M-1
            Em(row+1,col+1) = row * col;
            Gm(row+1,col+1) = Gm(row+1,col+1)^Em(row+1,col+1);
        end
    end
    % 对Gn的计算: 循环长度为N
    for row = 0:N-1
        for col = 0:N-1
            En(row+1,col+1) = row * col;
            Gn(row+1,col+1) = Gn(row+1,col+1)^En(row+1,col+1);
        end
    end
    
    F = real(Gm*data*Gn);  % F = Gm*f*Gn是计算公式,一般只要实部
    subplot(1,3,3);
    imshow(F);
    title('手写的myfft2生成的"频域"图像');
    
    error = sum(sum((real(F)-real(zidai)).^2));
    if error < 10^(-10)
        fprintf('自带与手写结果一致!\n');
    else
        fprintf('不一致!\n');
    end
    

    接着正变换结果(把频域结果当输入)逆变换程序如下,对应Matlab自带函数:ifft2

    % 鉴于正向fft2手写与自带结果一致;
    % ifft2的输入就直接用自带的fft2的结果。
    clc; clear;
    
    data = imread('zxc.jpg');  % 数据——最好比卷积核的尺寸大
    data = im2double(data); 
    data = rgb2gray(data);     % rgb转为灰度图像
    subplot(1,3,1);
    imshow(data);
    title('原始图像')
    
    F = fft2(data);
    subplot(1,3,2);
    imshow(real(F));  % 一般画图只要实部, 作为输入时实虚都要!!
    title('自带的fft2生成的"频域"图像');
    
    % s = ifft2(F);
    % subplot(1,3,3);
    % imshow(s);
    % return;
    
    size_data = size(F);
    M = size_data(1);  %(原始数据矩阵)的长
    N = size_data(2);  %(原始数据矩阵)的宽
    
    % 下面是傅里叶逆变换必备的一些矩阵:
    Wm = exp(-j*2*pi/M);
    Wn = exp(-j*2*pi/N);  % 不同G中用不同的W
    Em = zeros(M);
    En = zeros(N);        % E是辅助计算矩阵
    Gm = zeros(M)+Wm;
    Gn = zeros(N)+Wn;  % G是计算时要用的矩阵
    f = zeros(M,N);    % F是转换到频域的结果
    
    % 对Gm的计算: 循环长度为M
    fprintf('二维离散反傅里叶变换开始:\n');
    for row = 0:M-1
        for col = 0:M-1
            Em(row+1,col+1) = -row * col;
            Gm(row+1,col+1) = Gm(row+1,col+1)^Em(row+1,col+1);
        end
    end
    Gm = Gm/M;
    % 对Gn的计算: 循环长度为N
    for row = 0:N-1
        for col = 0:N-1
            En(row+1,col+1) = -row * col;
            Gn(row+1,col+1) = Gn(row+1,col+1)^En(row+1,col+1);
        end
    end
    Gn = Gn/N;   % 注意:这个/N和上面的/M都是算完G之后才除以的!因为上面计算的时候是幂项变化!
    
    f = real(Gm*F*Gn);  % f = Gm*F*Gn是计算公式,一般只要实部
    subplot(1,3,3);
    imshow(f);
    title('手写的myidft2生成的"原始"图像');
    
    error = sum(sum((real(f)-real(data)).^2));
    if error < 10^(-10)
        fprintf('反变换后与原图一致!\n');
    else
        fprintf('不一致!\n');
    end
    
    展开全文
  • 程序实现了快速傅里叶变换、逆变换等功能,可供参考
  • 在matlab中对图像进行傅里叶变换和逆变换。注意:m文件中的文件路径是在本人电脑上的路径,用户应修改成在您电脑中图片的绝对路径。谢谢大家的支持!
  • 对图像进行傅里叶变换及其逆变换,实现频谱搬移,并显示傅里叶变换及逆变换前后图像的变化
  • matlab傅里叶变换及逆变换和快速傅里叶变换,通过编程实战掌握具体应用。包括matlab傅里叶变换、matlab傅里叶逆变换、matlab快速傅里叶变换。
  • 根据数学分析中傅里叶级数的相关结论和黎曼积分的思想推导一维连续傅里叶变换和其逆变换的公式。
  • 傅里叶变换逆傅里叶变换numpy

    千次阅读 2020-02-20 16:20:37
    理论基础 时域:以时间为横坐标 频域:以频率的倒数为横坐标,可以看出,频域更加简单。 相位:时间差有关的一个概念。...1. 傅里叶变换 numpy.fft.fft2 1 实现傅里叶变换。 返回一个复数数组。...
  • clear all; clck1 = 1.3;a= 4e7;b= 6e8;Ep = 50e3;dt = 1.5e-9;T= 1.5e-7;t= 0:dt:T;x_t= k1*Ep*(exp(-a.*t)-exp(-b.*t));X= fft(x_t);X2 = X * 0.9;x_t_2 = ifft(X2);Fs = 1/dt; % Sampling...
  • 我们已经知道一维噪声可以用一维傅里叶变换到频域滤波,同理二维噪声也可以用二维傅里叶变换到"频率滤波"。二维傅里叶变换的原理笔者很讨厌一上来就看到一连串复杂的公式!因此当我看懂一个原理后,我就会用最好...
  • VS2010下实现的离散傅里叶变换和离散傅里叶逆变化代码。
  • WORD格式 专业资料整理 MATLAB作业 方法一 N=200;dt=0.001;n=1:200; x=3*sin(2*pi*10*n*dt)+3*sin(2*pi*30*n*dt)+sin(2*pi*40*n*dt)+sin(2 *pi*50*n*dt)+sin(2*pi*60*n*dt)+6*sin(2*pi*80*n*dt;...
  • 极坐标格式下的二维傅里叶变换与逆变换推导 直角坐标系下的二维傅里叶变换和逆变换分别如下: G(u,v)=∬g(x,y)e−j2π(ux+vy)dxdyg(x,y)=∬G(u,v)ej2π(ux+vy)dudv G(u,v)=\iint g(x,y)e^{-j2\pi (ux+vy)}dxdy \\ g...
  • 主要介绍了Python实现快速傅里叶变换的方法(FFT),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • //快速傅里叶变换 void fft2Image(InputArray _src, OutputArray _dst) { //得到Mat类型 Mat src = _src.getMat(); //判断位深 CV_Assert(src.type() == CV_32FC1 || src.type() == CV_64FC1); CV_Assert(src....
  • 在网上看到很多关于傅里叶变换的内容, 但是没找到具体工程上完整的一个例子例如把一个纹理转化为频谱图和相位 然后利用频谱和相位在转化回来于是就自己做一个好了如果有不对之处请使劲喷然后如果你比较熟悉只想看...
  • 加窗傅里叶变换的演示 matlab程序 分别对加方窗和海明窗的信号做傅里叶变换 函数可以改变窗口的大小 对理解傅里叶变换和频谱非常有帮助
  • 表面上看是对频域采样数据 X(k) 进行 N 点离散傅里叶逆变换, 实质上是用 X(k) / N 作为傅里叶系数对复指数信号进行加权合成一个周期信号, 再对一个周期进行采样得到 N 个时域采样数据。 ...
  • nbsp自然科学论文短时傅里叶变换及其逆变换(Short-Time Fourier Transform and Its Inverse).pdf11页本文档一共被下载:次,您可全文免费在线阅读后下载本文档。 下载提示1.本站不保证该用户上传...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,869
精华内容 4,747
热门标签
关键字:

傅里叶变换与逆变换的关系

友情链接: STM32TIME.rar