【OpenCV-Python】:图像的傅里叶变换与逆傅里叶变换

✨博客主页:王乐予🎈
✨年轻人要:Living for the moment(活在当下)!💪
🏆推荐专栏:【图像处理】【千锤百炼Python】【深度学习】【排序算法

😺一、知识储备

傅里叶变换就是将信号时域转化为频域的过程,本文用程序实现对二维图像的傅里叶变换与逆变换!首先需要知道一维傅里叶变换!⬇️⬇️⬇️

🐶1.1 一维傅里叶变换

一维傅里叶变换的过程如下方动图所示:
在这里插入图片描述
就像上面动图所示一样,一维的波可以用许多的正弦波叠加表示,这就是一维傅里叶变换的关键所在。

🐶1.2 二维傅里叶变换

这里引用一张知乎博主的图,十分通透!!!!!!

先贴上引用,尊重创作者!

https://zhuanlan.zhihu.com/p/99605178

在这里插入图片描述
如何表现🧐🧐🧐我们看!⬇️⬇️⬇️
在这里插入图片描述
右边图的每一个点都在描述一个平面波。

右图中的每一个点:

  • 它到中点的距离描述的是频率;
  • 中点到它的方向是平面波的方向;
  • 那点的灰度值是它的幅值。
    在这里插入图片描述
    通透!!!感谢这位博主的图🏆

请添加图片描述

😺二、基于OpenCV的频域变换

🐶2.1 傅里叶变换

🦄2.1.1 函数API

傅里叶变换:

函数式:out = cv2.dft(src, flag)

参数介绍:

  • 参数scr:输入图像;
  • 参数flag:转换标识,一般用cv2.DFT_COMPLEX_OUTPUT,即输出一个复数阵列,更多请参考dft
  • 返回值out:复数阵列。

🦄2.1.2 程序设计

import cv2
import matplotlib.pyplot as plt
import numpy as np

original = cv2.imread(r'C:\Users\Lenovo\Desktop\lena1.jpg', 0)  # 转为灰度图

dft = cv2.dft(np.float32(original), flags=cv2.DFT_COMPLEX_OUTPUT)
dftShift = np.fft.fftshift(dft)     #  将图像中的低频部分移动到图像的中心
result = 20 * np.log(cv2.magnitude(dftShift[:, :, 0], dftShift[:, :, 1]))   # 将实部和虚部转换为实部,乘以20是为了使得结果更大

plt.subplot(121), plt.imshow(original, cmap='gray')
plt.title('original')
plt.axis('off')

plt.subplot(122), plt.imshow(result, cmap='gray')
plt.title('fft')
plt.axis('off')
plt.show()

🦄2.1.3 结果可视化

在这里插入图片描述

🐶2.2 逆傅里叶变换

🦄2.2.1 程序设计

import cv2
import matplotlib.pyplot as plt
import numpy as np

original = cv2.imread(r'C:\Users\Lenovo\Desktop\lena1.jpg', 0)  # 转为灰度图

dft = cv2.dft(np.float32(original), flags=cv2.DFT_COMPLEX_OUTPUT)
dftShift = np.fft.fftshift(dft)     # 将图像中的低频部分移动到图像的中心
result = 20 * np.log(cv2.magnitude(dftShift[:, :, 0], dftShift[:, :, 1]))   # 将实部和虚部转换为实部,乘以20是为了使得结果更大

ishift = np.fft.ifftshift(dftShift)     # 低频部分从图像中心移开
iImg = cv2.idft(ishift)                 # 傅里叶反变换
iImg = cv2.magnitude(iImg[:, :, 0], iImg[:, :, 1])      # 转化为空间域

plt.subplot(131), plt.imshow(original, cmap='gray')
plt.title('original')
plt.axis('off')

plt.subplot(132), plt.imshow(result, cmap='gray')
plt.title('fft')
plt.axis('off')

plt.subplot(133), plt.imshow(iImg, cmap='gray')
plt.title('ifft')
plt.axis('off')
plt.show()

🦄2.2.2 结果可视化

在这里插入图片描述

😺三、基于NumPy的频域变换

🐶3.1 傅里叶变换

🦄3.1.1 程序设计

import cv2
import matplotlib.pyplot as plt
import numpy as np

original = cv2.imread(r'C:\Users\Lenovo\Desktop\lena1.jpg', 0)  # 转为灰度图

dft = np.fft.fft2(original)
dftShift = np.fft.fftshift(dft)     # 将图像中的低频部分移动到图像的中心
result = 20*np.log(np.abs(dftShift))

plt.subplot(121), plt.imshow(original, cmap='gray')
plt.title('original')
plt.axis('off')

plt.subplot(122), plt.imshow(result, cmap='gray')
plt.title('fft')
plt.axis('off')

plt.show()

🦄3.1.2 结果可视化

在这里插入图片描述

🐶3.2 逆傅里叶变换

🦄3.2.1 程序设计

import cv2
import matplotlib.pyplot as plt
import numpy as np

original = cv2.imread(r'C:\Users\Lenovo\Desktop\lena1.jpg', 0)  # 转为灰度图

dft = np.fft.fft2(original)
dftShift = np.fft.fftshift(dft)     # 将图像中的低频部分移动到图像的中心
result = 20*np.log(np.abs(dftShift))

ishift = np.fft.ifftshift(dftShift)     # 低频部分从图像中心移开
iImg = np.fft.ifft2(ishift)                 # 傅里叶反变换
iImg = np.abs(iImg)

plt.subplot(131), plt.imshow(original, cmap='gray')
plt.title('original')
plt.axis('off')

plt.subplot(132), plt.imshow(result, cmap='gray')
plt.title('fft')
plt.axis('off')

plt.subplot(133), plt.imshow(iImg, cmap='gray')
plt.title('ifft')
plt.axis('off')
plt.show()

🦄3.2.2 结果可视化

在这里插入图片描述

  • 19
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王乐予

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值