傅里叶变换图像处理的例子,图像做傅里叶变换

  傅里叶变换图像处理的例子,图像做傅里叶变换

  跟我学Python图像处理带你掌握傅里叶变换原理及实现_华为云开发者社区技术博客_博客

  摘要:傅里叶变换主要是将时域的信号转换成频域的信号,用于图像去噪和图像增强。

  本文由eastmount分享自华为云社区《[Python图像处理] 二十二.Python图像傅里叶变换原理及实现》。

  本文主要讲解图像傅里叶变换的相关内容。在数字图像处理中,有两种经典的变换,——傅立叶变换和Hough变换,被广泛应用。其中,傅里叶变换主要是将时域的信号转换成频域的信号,用于图像去噪和图像增强。

  傅里叶变换是图像傅里叶变换的原理,常用于数字信号处理。其目的是将时域信号转换成频域信号。随着域的不同,理解同一个事物的角度也是变化的,所以时域的一些难的地方在频域就可以简单处理了。同时,我们可以在频域中发现一些不容易检测到的特征。傅立叶定理指出“任何连续的周期信号都可以表示为(或无限近似为)一系列正弦信号的叠加。”

  下面是李老师的《Python OpenCV图像处理》中的一个案例,强烈推荐同学们学习。如下图所示,他把一个饮料生产过程的时域角度转换成了频域角度。

  绘制相应的时间图和频率图如下:

  傅立叶公式如下,其中W代表频率,T代表时间,是一个复变函数。它将时域中的函数表示为频域中函数f(t)的积分。

  傅立叶变换认为,一个周期函数(信号)包含多个频率分量,任意函数(信号)f(t)可以由多个周期函数(或基函数)相加合成。从物理角度来说,傅里叶变换是以一组特殊函数(三角函数)为正交基,对原函数进行线性变换。物理意义是原函数在每组基函数上的投影。如下图所示,它由三条正弦曲线组成。

  傅里叶变换可以应用于图像处理,其频谱可以通过变换图像得到。图像中灰度变化的强度由频谱中的频率来表征。图像中的边缘信号和噪声信号往往是高频信号,而图像变化频繁的图像轮廓和背景信号往往是低频信号。此时可以对图像进行相关操作,如图像去噪、图像增强、锐化等。

  二维图像的傅立叶变换可以由下面的数学公式(15-3)表示,其中f是空间域的值,f是频率域的值。

  在对以上傅里叶变换有了大致的了解之后,分别用Numpy和OpenCV来讲解图像傅里叶变换的算法和运算代码。

  2.Numpy实现傅里叶变换。Numpy中的FFT包提供了函数np.fft.fft2(),可以对信号进行快速傅立叶变换。该函数的原型如下所示,输出结果是一个复杂的数组。

  fft2(a,s=无,轴=(-2,-1),范数=无)

  a表示输入图像,复数数组S表示整数序列,可以决定输出数组的大小。输出可选形状(每个变换轴的长度),其中s[0]表示轴0,s[1]表示轴1。对应于fit(x,n)函数中的n,沿着每个轴,如果给定形状小于输入形状,则输入将被裁剪。如果大于,输入将用零填充。如果未给定“s ”,则沿着“axes”指定的轴的输入形状轴用于表示整数序列,该序列用于计算FFT的可选轴。如果不是,则使用最后两个轴。“轴”中的重复索引表示在该轴上执行多次变换,元素序列表示执行一维FFT。Norm包括两个选项,“无”和“正交”,以及归一化模式(请参见numpy.fft)。默认值为无。Numpy中的fft模块有很多功能,相关功能如下:

  #计算一维傅立叶变换

  numpy.fft.fft(a,n=无,轴=-1,范数=无)

  #计算二维傅立叶变换

  numpy . FFT . FFT T2(a,n=无,轴=-1,范数=无)

  #计算n维的傅立叶变换

  numpy.fft.fftn()

  # Ca

  #返回傅立叶变换的采样频率。

  numpy.fft.fftfreq()

  #将FFT输出中的DC分量移到频谱中心

  numpy.fft.shift()

  下面的代码是通过Numpy库实现傅立叶变换,调用NP . FFT . FFT T2()快速傅立叶变换得到频率分布,然后调用np.fft.fftshift()函数将中心位置向中间移动,最后通过Matplotlib显示效果图。

  # -*-编码:utf-8 -*-

  将cv2作为cv导入

  将numpy作为np导入

  从matplotlib导入pyplot作为plt

  #阅读图像

  img=cv.imread(test.png ,0)

  #快速傅立叶变换算法获得频率分布

  f=NP . FFT . FFT T2(img)

  #默认结果中心位置在左上角,

  #调用fftshift()函数移动到中间位置

  fshift=np.fft.fftshift(f)

  #fft结果是复数,其绝对值结果是幅度。

  fimg=np.log(np.abs(fshift))

  #显示结果

  plt.subplot(121),plt.imshow(img,灰色),plt.title(原始傅立叶)

  plt.axis(“关”)

  plt.subplot(122),plt.imshow(fimg, gray ),plt.title(Fourier Fourier )

  plt.axis(“关”)

  plt.show()的输出结果如图15-2所示,左图为原图,右图为频率分布图,其中频率越靠近中心越低,越亮(灰度值越高)的位置表示该频率的信号幅度越大。

  三。Numpy实现傅里叶逆变换。下面是Numpy如何实现傅里叶逆变换,傅里叶逆变换是傅里叶变换的逆运算,是将光谱图像转换成原始图像的过程。通过傅里叶变换转换成声谱图,对高频(边界)和低频(细节)部分进行处理,然后需要通过傅里叶逆变换恢复出原始效果图。频域中的图像处理会反映在逆变换图像中,从而更好地处理图像。

  用于图像傅立叶变换的主要函数如下:

  #实现图像的逆傅立叶变换,返回一个复数组

  numpy.fft.ifft2(a,n=无,轴=-1,范数=无)

  # fftstit()函数的反函数,将频谱图像的中央低频部分移动到左上角。

  numpy.fft.fftshift()

  #将复数转换为0到255的范围

  Iimg=numpy.abs(傅里叶逆变换的结果)

  下面的代码分别实现傅立叶变换和傅立叶逆变换。

  # -*-编码:utf-8 -*-

  将cv2作为cv导入

  将numpy作为np导入

  从matplotlib导入pyplot作为plt

  #阅读图像

  img=cv.imread(Lena.png ,0)

  #傅立叶变换

  f=NP . FFT . FFT T2(img)

  fshift=np.fft.fftshift(f)

  res=np.log(np.abs(fshift))

  #傅里叶逆变换

  ishift=np.fft.ifftshift(fshift)

  iimg=np.fft.ifft2(ishift)

  iimg=np.abs(iimg)

  #显示结果

  plt.subplot(131),plt.imshow(img,灰色),plt.title(原始图像)

  plt.axis(“关”)

  plt.subplot(132),plt.imshow(res, gray ),plt.title(傅立叶图像)

  plt.axis(“关”)

  plt.subplot(133),plt.imshow(iimg, gray ),plt.title(逆傅立叶图像)

  plt.axis(“关”)

  plt.show()的输出结果如图15-4所示。从左到右分别是原始图像、光谱图像和傅里叶逆变换图像。

  四。OpenCV实现傅立叶变换。OpenCV中对应的函数是cv2.dft(),和用Numpy输出的结果一样,只是用了两个通道。第一个通道是结果的实部,第二个通道是结果的虚部,输入图像要先转换成np.float32格式。该函数的原型如下:

  dst=cv2.dft(src,dst=None,flags=None,nno牛油=None)

  Src表示输入图像,输出图像需要用np.float32转换格式dst表示,包括输出大小和表示转换标记的大小标志,其中DFT _INVERSE进行反向一维或二维转换,而不是默认的正向转换;DFT _SCALE表示缩放结果,除以数组元素个数;DFT _ROWS对输入矩阵的每一行执行正向或反向转换。此标志可以同时变换多个向量,并可用于减少执行3D和更高维度变换等的开销。DFT _COMPLEX_OUTPUT进行1D或2D实数组的正向转换,这是最快的选择,也是默认函数;DFT _REAL_OUTPUT执行一维或二维复数数组的逆变换,结果通常是相同大小的复数数组。然而,如果输入数组具有共轭复对称性,则输出是实数组。nonzeroRows是指当参数不为零时,函数假设只有nonzeroRows(未设置)的输入数组的第一行或者只有输出数组的第一行(设置)包含非零,这样函数可以更高效地处理剩余的行,节省一些时间;这种技术对于使用DFT计算阵列互相关或卷积非常有用。因为输出的频谱结果是复数,所以需要调用cv2.magnitude()函数将傅里叶变换的两路结果转换到0到255的范围内。其功能原型如下:

  cv2.magnitude(x,y)

  X表示浮点X坐标值,即实部Y表示浮点Y坐标值,即虚部。

  最终输出结果是振幅,即:

  完整的代码如下:

  # -*-编码:utf-8 -*-

  将numpy作为np导入

  导入cv2

  从matplotlib导入pyplot作为plt

  #阅读图像

  img=cv2.imread(Lena.png ,0)

  #傅立叶变换

  dft=cv2.dft(np.float32(img),flags=cv2。DFT _复杂_输出)

  #将频谱低频从左上角移动到中心位置

  dft_shift=np.fft.fftshift(dft)

  #光谱图像用双通道复数转换成0-255区间。

  result=20 * NP . log(cv2 . magnitude(dft_shift[:0],DFT _ shift[:1])

  #显示图像

  plt.subplot(121),plt.imshow(img,cmap=gray )

  plt.title(输入图像)、plt.xticks([])、plt.yticks([])

  plt.subplot(122),plt.imshow(result,cmap=gray )

  plt.title(星等谱),plt.xticks([]),plt.yticks([])

  plt.show()的输出结果如图15-5所示,左边是原始的“Lena”图像,右边是转换后的频谱图像,并保证低频在中心。

  动词(verb的缩写)用OpenCV实现傅里叶逆变换在OpenCV中,傅里叶逆变换是通过函数cv2.idft()实现的,返回的结果取决于原图像的类型和大小,可以是实数,也可以是复数。该函数的原型如下:

  dst=cv2.idft(src[,dst[,flags[,nonzeroRows]])

  Src表示输入图像,包括实数或复数dst表示输出图像标志表示转换标记nonzeroRows表示要处理的dst行数,其他行的内容未定义(请参考dft描述中的卷积示例)。完整的代码如下:

  # -*-编码:utf-8 -*-

  将numpy作为np导入

  导入cv2

  从matplotlib导入pyplot作为plt

  #阅读图像

  img=cv2.imread(Lena.png ,0)

  #傅立叶变换

  dft=cv2.dft(np.float32(img),flags=cv2。DFT _复杂_输出)

  dftshift=np.fft.fftshift(dft)

  res1=20 * NP . log(cv2 . magnitude(dftshift[:0],DFT shift[:1])

  #傅里叶逆变换

  is hift=NP . FFT . IFFT shift(DFT shift)

  iimg=cv2.idft(ishift)

  res2=cv2.magnitude(iimg[:0],iimg[:1])

  #显示图像

  plt.subplot(131),plt.imshow(img,灰色),plt.title(原始图像)

  plt.axis(“关”)

  plt.subplot(132),plt.imshow(res1,灰色),plt.title(傅立叶图像)

  plt.axis(“关”)

  plt.subplot(133),plt.imshow(res2,灰色),plt.title(逆傅立叶图像)

  plt.axis(“关”)

  plt.show()的输出结果如图15-6所示。第一张图是Lena原图,第二张图是傅里叶变换后的光谱图像,第三张图是傅里叶逆变换的过程,光谱图像转换成原图。

  不及物动词总结傅里叶变换的目的不是观察一幅图像的频率分布(至少不是最终目的),更多的时候是对频率进行滤波,通过修改频率来达到图像增强、图像去噪、边缘检测、特征提取、压缩和加密的目的。在下一篇文章中,作者将结合傅立叶变换和逆傅立叶变换来说明其应用。

  第一时间点击了解华为云鲜技术~

  原创作品来自华为云开发者联盟,

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: