在数学概念里,傅立叶转换指的是 时间域转 转换到 频率域
在OpenCV概念里,傅立叶变换指的是 图像的空间域 转换到 频率域
作用:高通滤波, 低通滤波
1、Numpy 实现傅立叶变换 (逆傅立叶变换)
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图片
img = cv2.imread('/Users/manmi/Documents/GitHub/open_cv/源代码及图像/chapter14/image/boat.bmp', 0)
# 傅里叶转换
f = np.fft.fft2(img)
# 零频率分量移到频域图像的中心位置
fshift = np.fft.fftshift(f)
# 零频率分量移到频域图像的原始位置(左上角)
ishift = np.fft.ifftshift(fshift)
# 逆傅里叶转换,输出是一个复数
iimg = np.fft.ifft2(ishift)
# 将复数调整到 [0, 255] 的灰度空间
iimg = np.abs(iimg)
# plot 原始图像和操作后的结果图像
plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('original'), plt.axis('off')
plt.subplot(122), plt.imshow(iimg, cmap='gray')
plt.title('iimg'), plt.axis('off')
plt.show() # 得到的图像是一样的。
高通滤波举例:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图片
img = cv2.imread('/Users/manmi/Documents/GitHub/open_cv/源代码及图像/chapter14/image/boat.bmp', 0)
# 傅里叶转换
f = np.fft.fft2(img)
# 零频率分量移到频域图像的中心位置
fshift = np.fft.fftshift(f)
# 频域图像中心区域(低频信息区域)值设置为0
rows, cols, = img.shape
crows, ccols = int(rows/2), int(cols/2)
fshift[crows-30:crows+30, ccols-30:ccols+30] = 0
# 零频率分量移到频域图像的原始位置(左上角)
ishift = np.fft.ifftshift(fshift)
# 逆傅里叶转换,输出是一个复数
iimg = np.fft.ifft2(ishift)
# 将复数调整到 [0, 255] 的灰度空间
iimg = np.abs(iimg)
# plot 原始图像和操作后的结果图像
plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('original'), plt.axis('off')
plt.subplot(122), plt.imshow(iimg, cmap='gray')
plt.title('iimg'), plt.axis('off')
plt.show() # 得到的图像是一样的。