**傅里叶变换**
对图像的傅里叶变换,就是将图像从图像空间变换到频率空间,从而可以在频率域对图像进行处理。
1、傅里叶变换及其反变换
在numpy中自带了函数fft2进行二维傅里叶变换,它其实是离散快速傅里叶变换。
在频率域对图像进行处理后,要将其反变换到空间域才能显示图像。
可用函数 np.fft.ifft2()函数进行傅里叶反变换。
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定字体,不然会乱码
img = cv.imread('lena512color.tiff', 0)
f = np.fft.fft2(img) # 将空间域转化为频率域
mf = np.log(np.abs(f)) # 取绝对值f 对数
# 傅里叶反变换
fan = np.fft.ifft2(f)
mfan = np.abs(fan)
plt.subplot(131),plt.imshow(img, cmap='gray'),plt.title('原图')
plt.subplot(132),plt.imshow(mf, cmap='gray'),plt.title('傅里叶频谱')
plt.subplot(133),plt.imshow(mfan, cmap='gray'),plt.title('傅里叶反变换')
plt.show()
如下图,左图是lena图像,中间图是它的傅里叶频谱图,最后一张即是反变换回来的图
2.将低频移至中心
在此傅里叶频谱中,频率为0的分量在其左上角,但是一般情况下我们会将其移至中心,再对其进行处理。
可以用函数fftshift()将低频部分移至中心。
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定字体,不然会乱码
img = cv.imread('lena512color.tiff', 0)
f = np.fft.fft2(img) # 将空间域转化为频率域
mf = np.log(np.abs(f)) # 取绝对值f 对数,mp为频谱图
# 将低频移至傅里叶频谱中心
fshift = np.fft.fftshift(f)
mfshift = np.log(np.abs(fshift))
plt.subplot(131),plt.imshow(img, cmap='gray'),plt.title('原图')
plt.subplot(132),plt.imshow(mf, cmap='gray'),plt.title('傅里叶频谱')
plt.subplot(133),plt.imshow(mfshift, cmap='gray'),plt.title('低频移至傅里叶频谱中心')
plt.show()
右图就是将低频移至中心的傅里叶频谱图。