为什么fft或者ifft之后要fftshift
时间: 2023-10-03 18:02:03 浏览: 53
在进行FFT变换时,输出结果的第一个值代表的是0频率,后面的值依次代表了不同频率的幅值。但是,由于FFT的算法特性,输出结果的前一半包含了正频率,后一半包含了负频率,因此需要进行频谱的移位操作,将结果的前一半和后一半分别交换位置,以使得频谱的零频率位于结果的中心位置。这个操作就是FFTShift。同样地,进行IFFT变换时,也需要进行相应的移位操作,以便于正确还原原始信号。
相关问题
对图片进行FFT算法和IFFT算法
对图片进行FFT算法和IFFT算法的步骤如下:
1. 读取图片并将其转换为灰度图像。
2. 对灰度图像进行傅里叶变换(FFT)。
```python
import cv2
import numpy as np
# 读取图片并转换为灰度图像
img = cv2.imread('image.jpg', 0)
# 进行傅里叶变换
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20 * np.log(np.abs(fshift))
```
3. 对傅里叶变换后的图像进行频谱图像的可视化。
```python
import matplotlib.pyplot as plt
# 可视化频谱图像
plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()
```
4. 对傅里叶变换后的图像进行逆变换(IFFT)。
```python
# 进行傅里叶逆变换
f_ishift = np.fft.ifftshift(fshift)
img_back = np.fft.ifft2(f_ishift)
img_back = np.abs(img_back)
```
5. 对逆变换后的图像进行可视化。
```python
# 可视化逆变换后的图像
plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(img_back, cmap='gray')
plt.title('Image after LPF'), plt.xticks([]), plt.yticks([])
plt.show()
```
gray_fft = np.fft.fft2(gray) gray_fftshift = np.fft.fftshift(gray_fft) dst_fftshift = np.zeros_like(gray_fftshift) M, N = np.meshgrid(np.arange(-cols // 2, cols // 2), np.arange(-rows // 2, rows // 2)) D = np.sqrt(M ** 2 + N ** 2) Z = (rh - r1) * (1 - np.exp(-c * (D ** 2 / d0 ** 2))) + r1 dst_fftshift = Z * gray_fftshift dst_fftshift = (h - l) * dst_fftshift + l dst_ifftshift = np.fft.ifftshift(dst_fftshift) dst_ifft = np.fft.ifft2(dst_ifftshift) dst = np.real(dst_ifft) dst = np.uint8(np.clip(dst, 0, 255)) return dst
在这个函数中,首先使用np.fft.fft2函数将输入图像进行二维傅里叶变换,然后使用np.fft.fftshift函数将变换结果进行中心化处理。接下来,创建一个与输入图像大小相同的全零数组dst_fftshift,并计算出输入图像的行数和列数。
函数接着使用np.meshgrid函数生成网格坐标,并根据频率域滤波器的公式计算出增益系数Z。然后,将增益系数Z乘以中心化的傅里叶变换结果gray_fftshift,得到增益后的频率域图像dst_fftshift。
接着,将增益后的频率域图像dst_fftshift乘以(h - l),再加上l,得到最终的频率域图像。然后,使用np.fft.ifftshift函数将频率域图像逆中心化,并使用np.fft.ifft2函数将其转换回空间域。最后,将输出图像进行限幅处理,转换为8位无符号整数类型,然后返回输出图像。