当前位置: 首页 > news >正文

问题三十二:离散二维傅立叶变换(Discrete Fourier Transformation)

在这里插入图片描述
为了将灰度图像表示为频谱图,我们需要进行以下步骤:

  1. 加载图像并将其转换为灰度图像。
  2. 对图像进行二维离散傅里叶变换。
  3. 将变换结果表示为幅度谱和相位谱。
  4. 可以对幅度谱和相位谱进行可视化,以查看频率分布。
  5. 对幅度谱和相位谱进行逆变换,以获得原始图像。

接下来是Python实现:

import numpy as np
import cv2
import matplotlib.pyplot as plt# Step 1: 加载图像并将其转换为灰度图像
img = cv2.imread('image.jpg', 0)# Step 2: 对图像进行二维离散傅里叶变换
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)# Step 3: 将变换结果表示为幅度谱和相位谱
magnitude_spectrum = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
phase_spectrum = np.angle(dft_shift)# Step 4: 对幅度谱和相位谱进行可视化
plt.subplot(121), plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(phase_spectrum, cmap='gray')
plt.title('Phase Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()# Step 5: 对幅度谱和相位谱进行逆变换,以获得原始图像
magnitude_spectrum = cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1])
magnitude_spectrum = cv2.idft(np.exp(cv2.phase(dft_shift) * 1j) * magnitude_spectrum)
magnitude_spectrum = cv2.magnitude(magnitude_spectrum[:, :, 0], magnitude_spectrum[:, :, 1])# 将结果可视化
plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Reconstructed Image'), plt.xticks([]), plt.yticks([])
plt.show()

解释:

  • Step 1:我们使用OpenCV的cv2.imread函数加载图像,并将其转换为灰度图像。
  • Step 2:我们使用cv2.dft函数对灰度图像进行二维离散傅里叶变换。然后,我们使用np.fft.fftshift函数将结果进行中心化,以便更好地可视化。
  • Step 3:我们使用cv2.magnitude函数计算幅度谱,并使用np.angle函数计算相位谱。
  • Step 4:我们使用matplotlib库对幅度谱和相位谱进行可视化。在幅度谱中,亮度表示频率分量的强度;在相位谱中,亮度表示相位值。
  • Step 5.1:我们使用np.exp函数将相位谱转换为复数形式,并将其与幅度谱相乘,得到复数频谱。
  • Step 5.2:我们使用np.fft.ifft2函数对复数频谱进行逆变换,得到图像的复原结果。
  • Step 5.3:我们使用cv2.magnitude函数计算逆变换结果的幅度谱,并使用cv2.imshow函数将其显示出来。注意,我们需要在这里使用np.zeros_like函数来创建一个与idft数组大小相同的全零数组,以保证cv2.magnitude函数可以正常工作。

最后,我们将原始图像和复原图像放在一起进行可视化。注意,我们需要使用plt.subplot函数来创建子图。

http://www.lryc.cn/news/25017.html

相关文章:

  • 恢复谷歌翻译的究极方法
  • string函数以及string常用接口
  • 分享一篇由C语言实现《数据结构》无头无循环单链表
  • C盘爆满?两个超简单的解决办法
  • ThreadLocal
  • Java基础:JDK7-时间Date
  • 什么是IP地址?
  • 4年经验之谈,什么是接口测试?怎样做接口测试?
  • 普通指针扫盲
  • 深度学习笔记:神经网络权重确定初始值方法
  • 关于 python 的异常使用说明 (python 的文件和异常)
  • Spark RDD持久化
  • 【Linux】Linux系统安装Python3和pip3
  • 用java进行base64加密
  • torch函数合集
  • AcWing算法提高课-3.1.2信使
  • Paddle OCR Win 11下的安装和简单使用教程
  • 杂谈:数组index问题和对象key问题
  • 三天Golang快速入门—Slice切片
  • 腾讯会议演示者视图/演讲者视图
  • 【C++】类与对象(一)
  • JavaScript基本语法
  • OpenCV4.x图像处理实例-道路车辆检测(基于背景消减法)
  • pwnlab通关流程
  • 面向过程与面向对象的区别与联系
  • 主机状态(查看资源占用情况、查看网络占用情况)
  • 代码随想录算法训练营第四十一天 | 01背包问题-二维数组滚动数组,416. 分割等和子集
  • VMware NSX 4.1 发布 - 网络安全虚拟化平台
  • 计算理论 复杂度预备知识
  • 二叉树——二叉搜索树中的插入操作