如果用OpenCV-Python进行图像的离散傅里叶变换与逆变换其实还蛮简单的,流程就是上图所示,值得注意的是,如果是多通道的图像,譬如多光谱、高光谱图像,需要对每个通道都进行傅里叶变换,最后再聚合,如果只是RGB,可以用如下方式合成灰度图,只需要对灰度图做处理即可。
img1 = 0.2126 * image1[:,:,0] + 0.7152 * image1[:,:,1] + 0.0722 * image1[:,:,2]
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
# 测试图像
ori=cv.imread(r"F:\ori.jpg")
# numpy 中的 fft 需要输入灰度图,我们需要将图像分割成不同的通道
def getRGBDFT(img):
# cv2默认的图像通道是BGR,需要进行转换
img=cv.cvtColor(img,cv.COLOR_BGR2RGB)
# 分离通道
r,g,b=cv.split(img)
# 对每个通道进行傅里叶变换
f_r,f_g,f_b=_dft(r),_dft(g),_dft(b)
# 组合通道,还是以bgr格式返回
return cv.merge([f_b,f_g,f_r])
def _dft(img):
f=cv.dft(np.float32(img),flags=cv.DFT_COMPLEX_OUTPUT)
# 计算幅度谱
magnitude=cv.magnitude(f[:,:,0],f[:,:,1])
# 对数变换增强对比度
res=np.log(magnitude+1)
# 移动低频分量至中心
return np.fft.fftshift(res)
out=getRGBDFT(ori)
# 选取
plt.subplot(121),plt.imshow(ori[:,:,0],cmap='gray')
plt.title("Ori"),plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(out[:,:,0],cmap='gray')
plt.title("Magnitude"),plt.xticks([]),plt.yticks([])
plt.show()
我们查看B通道的图像与傅里叶幅度谱:
接下来要进行傅里叶逆变换,代码如下:
def _idft(img):
img=np.fft.ifftshift(img