佛山网站制作平台,建设通网站账号,企业融资计划,网络推广渠道目录
一、傅里叶变换
1.1 傅里叶变换概念
1.2 opencv中傅里叶变换
二、实验代码 一、环境
本文使用环境为#xff1a;
Windows10Python 3.9.17opencv-python 4.8.0.74
二、傅里叶变换
2.1 傅里叶变换概念
傅里叶变换#xff08;Fourier Transform#xff09;是一种…目录
一、傅里叶变换
1.1 傅里叶变换概念
1.2 opencv中傅里叶变换
二、实验代码 一、环境
本文使用环境为
Windows10Python 3.9.17opencv-python 4.8.0.74
二、傅里叶变换
2.1 傅里叶变换概念
傅里叶变换Fourier Transform是一种在数学、物理和工程领域广泛应用的算法用于分析信号或数据的频率成分。它是由法国数学家约瑟夫·傅里叶Joseph Fourier于19世纪初提出的因此得名。傅里叶变换的基本思想是将一个时域信号转换为频域信号或者将一个频域信号转换回时域信号。这种转换可以帮助我们更好地理解和分析信号的特性例如幅度、频率和相位等。
傅里叶变换可以分为连续傅里叶变换Continuous Fourier TransformCFT和离散傅里叶变换Discrete Fourier TransformDFT。连续傅里叶变换用于处理连续时间信号而离散傅里叶变换用于处理离散时间信号。在实际应用中由于计算机处理的是离散数据因此离散傅里叶变换更为常用。
离散傅里叶变换DFT的基本步骤如下 对输入信号进行采样得到离散时间信号。采样频率通常为原始信号频率的整数倍以满足奈奎斯特采样定理。 对离散时间信号进行窗函数处理。窗函数的作用是减小信号截断引起的频谱泄漏同时减小频谱旁瓣的影响。常用的窗函数有矩形窗、汉宁窗和海宁窗等。 计算离散时间信号的离散傅里叶变换。这可以通过快速傅里叶变换Fast Fourier TransformFFT算法来实现以提高计算效率。快速傅里叶变换是一种基于蝶形运算的高效算法其计算复杂度为O(nlogn)其中n为信号长度。 对离散傅里叶变换的结果进行分析。通过观察频谱图可以了解信号的频率分布、幅值和相位等信息。此外还可以利用傅里叶变换的性质进行信号处理例如滤波、降噪和压缩等。
傅里叶变换具有以下重要性质 线性性质傅里叶变换满足线性叠加原理即两个信号的傅里叶变换之和等于这两个信号分别进行傅里叶变换后再相加的结果。 共轭对称性对于实数信号其傅里叶变换的共轭复数表示了信号的频谱。这意味着实数信号的频谱是以原点为中心的对称分布。 时移性质对于任意实数τ信号x(t)与其自身延时τ的信号x(t-τ)的傅里叶变换之比等于e^(j2πτ)其中j为虚数单位。这表明时移操作可以通过乘以复指数因子来实现。 频移性质对于任意实数ω信号x(t)与其频率为ω的信号cos(2πωt)的乘积的傅里叶变换等于X(f)与δ(f-ω)的卷积其中δ(f)表示狄拉克δ函数。这表明频率调制可以通过乘以复指数因子和滤波操作来实现。 能量守恒离散傅里叶变换的能量守恒性质表明信号的总能量在时域和频域之间是平衡的。这意味着在频域中去除某些频率分量后信号的总能量会相应地转移到其他频率分量上。
总之傅里叶变换是一种强大的数学工具广泛应用于通信、图像处理、音频处理、生物信息学等领域。通过傅里叶变换我们可以更好地理解和分析信号的特性从而实现信号的滤波、降噪、压缩等功能。
2.2 opencv中傅里叶变换
在数字图像处理中空间域滤波和频域滤波都是常见的方法但它们之间存在一些关键的区别。 空间域滤波这种方法直接对图像进行操作通常使用各种模板与图像进行卷积运算来实现图像的处理。由于其直接在图像空间上操作这种方法的实现相对简单和直观。 频域滤波频域滤波首先将图像从空间域转换到频域然后对频率域中的图像数据进行处理最后再将其转换回空间域。这种处理方法的优点在于某些图像处理任务在频域中比在空间域中更为简单。例如根据卷积定理可以通过傅立叶变换将空域卷积滤波变换为频域滤波。此外频域滤波允许设计者使用复杂的滤波器设计这可能在空间域中难以实现。然而需要注意的是如果选用的频域滤波器具有陡峭的变化可能会导致输出图像产生“振铃”现象这是由于灰度剧烈变化处产生的。
在OpenCV库中傅里叶变换和逆傅里叶变换的实现主要依赖于**cv2.dft()和cv2.idft()**两个函数。在进行傅里叶变换时你需要将原始图像转换为np.float32格式。
具体来说cv2.dft()函数的定义是cv2.dft(原始图像转换标识)。其中原始图像必须是np.float32格式转换标识用于说明是傅里叶变换还是傅里叶逆变换。此函数返回与前一个相同的结果但是有两个通道。第一个通道是结果的实部第二个通道是结果的虚部。
另一方面cv2.idft()函数被用来执行逆傅里叶变换。例如如果你有一个通过傅里叶变换得到的复数矩阵你可以使用这个函数来恢复原始图像。
需要注意的是OpenCV提供的这两个函数的效率较高比OpenCV自带的函数快3倍。这是因为它们实现了一种称为快速傅立叶变换FFT的快速算法。
三、实验代码
from __future__ import print_function
import sysimport cv2 as cv
import numpy as npdef print_help():print(代码演示离散傅里叶变换同时也显示幅度谱)def main(argv):print_help()I cv.imread(d:/Data/1.jpg, cv.IMREAD_GRAYSCALE)if I is None:print(Error opening image)return -1## [expand]rows, cols I.shapem cv.getOptimalDFTSize( rows )n cv.getOptimalDFTSize( cols )# 把图像边界拓展下padded cv.copyMakeBorder(I, 0, m - rows, 0, n - cols, cv.BORDER_CONSTANT, value[0, 0, 0])## [complex_and_real]planes [np.float32(padded), np.zeros(padded.shape, np.float32)]complexI cv.merge(planes) # Add to the expanded another plane with zeros## [complex_and_real]## [dft]cv.dft(complexI, complexI) # this way the result may fit in the source matrix## [dft]# compute the magnitude and switch to logarithmic scale# log(1 sqrt(Re(DFT(I)) ^ 2 Im(DFT(I)) ^ 2))## [magnitude]cv.split(complexI, planes) # planes[0] Re(DFT(I), planes[1] Im(DFT(I))cv.magnitude(planes[0], planes[1], planes[0])# planes[0] magnitudemagI planes[0]## [magnitude]## [log]matOfOnes np.ones(magI.shape, dtypemagI.dtype)cv.add(matOfOnes, magI, magI) # switch to logarithmic scale# 取log是为了拉伸值cv.log(magI, magI)## [log]## [crop_rearrange]magI_rows, magI_cols magI.shape# crop the spectrum, if it has an odd number of rows or columnsmagI magI[0:(magI_rows -2), 0:(magI_cols -2)]cx int(magI_rows/2)cy int(magI_cols/2)q0 magI[0:cx, 0:cy] # Top-Left - Create a ROI per quadrantq1 magI[cx:cxcx, 0:cy] # Top-Rightq2 magI[0:cx, cy:cycy] # Bottom-Leftq3 magI[cx:cxcx, cy:cycy] # Bottom-Righttmp np.copy(q0) # 交换象限左上和右下交换magI[0:cx, 0:cy] q3magI[cx:cx cx, cy:cy cy] tmptmp np.copy(q1) # 交换象限右上和左下交换magI[cx:cx cx, 0:cy] q2magI[0:cx, cy:cy cy] tmp# 归一化到 [0, 1]范围内cv.normalize(magI, magI, 0, 1, cv.NORM_MINMAX)# 原图得灰度图cv.imshow(Input Image , I )# 幅度谱也叫频谱cv.imshow(spectrum magnitude, magI)cv.waitKey()if __name__ __main__:main(sys.argv[1:])原图 灰度图 幅度谱如下中间是高频区域、边界是低频区域、幅度谱是关于图像中心对称的。