基于OpenCV-Python的彩色图像傅里叶变换

在这里插入图片描述

如果用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值