一.傅立叶变换基本操作
傅立叶变换的相应操作
包括了:变换与逆变换,变换后得到频域上的图像的幅值、相位。
# 傅立叶变换 相应操作
# 得到频域上的图像,其幅值、相位
# 变换再逆变换得到原图
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('Lena.jpg', 0) # 直接读为灰度图像
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
# 取绝对值.:将复数变化成实数
# 取对数的目的为了将数据变化到较小的范围(比如0-255)
c1 = np.log(np.abs(f)) # 频域后图像的振幅信息
c2 = np.log(np.abs(fshift)) # 中心化操作
ph_f = np.angle(f) # 图像上每个像素点对应的相位图
ph_fshift = np.angle(fshift) # 中心化操作
# 逆变换
f0shift = np.fft.ifftshift(fshift)
img_back = np.fft.ifft2(f0shift)
img_back = np.abs(img_back) # 出来的是复数,无法显示
# 逆变换--取绝对值就是振幅
f1shift = np.fft.ifftshift(np.abs(fshift))
img_back1 = np.fft.ifft2(f1shift)
img_back1 = np.abs(img_back1)
img_back1 = (img_back1-np.amin(img_back1))/(np.amax(img_back1)-np.amin(img_back1))
# 逆变换--取相位
f2shift = np.fft.ifftshift(np.angle(fshift))
img_back2 = np.fft.ifft2(f2shift)
# 出来的是复数,无法显示
img_back2 = np.abs(img_back2)
# 调整大小范围便于显示
img_back2 = (img_back2-np.amin(img_back2))/(np.amax(img_back2)-np.amin(img_back2))
# 逆变换--两者合成
s1 = np.abs(fshift) # 取振幅
s1_angle = np.angle(fshift) # 取相位
s1_real = s1*np.cos(s1_angle) # 取实部
s1_imag = s1*np.sin(s1_angle) # 取虚部
s2 = np.zeros(img.shape, dtype=complex)
s2.real = np.array(s1_real) # 重新赋值s1给s2
s2.imag = np.array(s1_imag)
f3shift = np.fft.ifftshift(s2) # 对新的进行逆变换
img_back3 = np.fft.ifft2(f3shift)
# 出来的是复数,无法显示
img_back3 = np.abs(img_back3)
# 调整大小范围便于显示
img_back3 = (img_back3-np.amin(img_back3))/(np.amax(img_back3)-np.amin(img_back3))
plt.subplot(421), plt.imshow(img, 'gray'), plt.title('original')
plt.subplot(422), plt.imshow(c1, 'gray'), plt.title('Amplitude')
plt.subplot(423), plt.imshow(c2, 'gray'), plt.title('center')
plt.subplot(424), plt.imshow(ph_f, 'gray'), plt.title('phases')
plt.subplot(425), plt.imshow(img_back, 'gray'), plt.title('img_back')
plt.show()
结果展示:
二.低通滤波
频域上的低通滤波相当于平滑滤波处理。
import cv2
import numpy as np
import matplotlib.pyplot as plt
# ideal lowpass filter
def lowPassFilter(image, d):
f = np.fft.fft2(image)
fshift = np.fft.fftshift(f)
def make_transform_matrix(d):
transfor_matrix = np.zeros(image