基于Python实现图像的傅里叶变换

 更新时间:2021年12月17日 11:51:25   作者:一马归一码  
傅里叶变换是一种函数在空间域和频率域的变换,从空间域到频率域的变换是傅里叶变换,而从频率域到空间域是傅里叶的反变换。这篇文章主要为大家介绍的是通过Python实现图像的傅里叶变换,感兴趣的可以了解一下

前言

首先是本文总体代码,改一下图像的读取路径就可以运行了,但我还是建议大家先看后面的步骤一行行敲代码,这样效果更好:

"""
Author:XiaoMa
date:2021/11/7
"""
import cv2
import matplotlib.pyplot as plt
import numpy as np
 
#读取图像信息
from numpy.fft import ifftshift
 
img0 = cv2.imread("E:\From Zhihu\For the desk\cvthirteen2.jpg")
img1 = cv2.resize(img0, dsize = None, fx = 0.5, fy = 0.5)
img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)               #转化为灰度图
h, w = img1.shape[:2]
print(h, w)
cv2.namedWindow("W0")
cv2.imshow("W0", img2)
cv2.waitKey(delay = 0)
#将图像转化到频域内并绘制频谱图
##numpy实现
plt.rcParams['font.family'] = 'SimHei'       #将全局中文字体改为黑体
f = np.fft.fft2(img2)
fshift = np.fft.fftshift(f)   #将0频率分量移动到图像的中心
magnitude_spectrum0 = 20*np.log(np.abs(fshift))
#傅里叶逆变换
#Numpy实现
ifshift = np.fft.ifftshift(fshift)
# 将复数转为浮点数进行傅里叶频谱图显示
ifimg = np.log(np.abs(ifshift))
if_img = np.fft.ifft2(ifshift)
origin_img = np.abs(if_img)
imggroup = [img2, magnitude_spectrum0, ifimg, origin_img]
titles0 = ['原始图像', '经过移动后的频谱图', '逆变换得到的频谱图', '逆变换得到的原图']
for i in range(4):
    plt.subplot(2, 2, i + 1)
    plt.xticks([])                               #除去刻度线
    plt.yticks([])
    plt.title(titles0[i])
    plt.imshow(imggroup[i], cmap = 'gray')
plt.show()
##OpenCV实现
dft = cv2.dft(np.float32(img2), flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
magnitude_spectrum1 = 20*np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
plt.subplot(121), plt.imshow(img2, cmap = 'gray')
plt.title('原图'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(magnitude_spectrum1, cmap = 'gray')
plt.title('频谱图'), plt.xticks([]), plt.yticks([])
plt.show()

(1)基本概念

一般我们观察信号是直接在时域内(声音信号)或者空间内(图像)对其进行分析,这样虽然符合常理,但信号中的一些有用的条件就不会被我们考虑进去,从而达不到分析的效果,所以我们要将信号转化到其他的一些变换域中进行分析。

(2)读取图像信息

本系列文章经典操作:

"""
Author:XiaoMa
date:2021/11/7
"""
import cv2
import matplotlib.pyplot as plt
import numpy as np
 
#读取图像信息
img0 = cv2.imread("E:\From Zhihu\For the desk\cvthirteen2.jpg")
img1 = cv2.resize(img0, dsize = None, fx = 0.5, fy = 0.5)
img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)               #转化为灰度图
h, w = img1.shape[:2]
print(h, w)
cv2.namedWindow("W0")
cv2.imshow("W0", img1)
cv2.waitKey(delay = 0)

得到图像信息如下:

540 960 

1. 傅里叶变换

代码参考:OpenCV官网

(1)基本概念

当我们描述一段声音时,我们不仅会说它的音量的大小如何,还有可能会说它的频率是高的还是低的,那么我们该怎么理解频率这个概念呢?以前学习三角函数时我们被告知每一个正弦信号有它的固定的频率,就是它的周期的倒数。那么什么是频域呢?我们也接触过其他形状的波形,比如方波、三角波等等,而这些不同形状的波呢,就是用一个个频率不相同的正弦波组成的,如果我们将那些不同频率的正弦波按照它们的频率大小排列起来,就得到了一个频率轴(这是一维的),然后我们将各个频率对应的幅度值给它们对应起来(就像xoy平面一样)得到的二维的平面,就是频域了。傅里叶变换就是将信号从时域转化到频域的一个工具。对于傅里叶变换中的的理解可以参考下面的图片:

当然如果你想更加深入的了解傅里叶变换,你可以按照图片上的水印去搜索,他那里讲的非常清晰。 

(2)numpy实现

#将图像转化到频域内并绘制频谱图
plt.rcParams['font.family'] = 'SimHei'       #将全局中文字体改为黑体
f = np.fft.fft2(img2)
fshift = np.fft.fftshift(f)       #将0频率分量移动到中心
magnitude_spectrum = 20*np.log(np.abs(fshift))
plt.xticks([])                               #除去刻度线
plt.yticks([])
plt.title("频谱图")
plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.show()

(3)OpevCV实现 

#OpenCV实现
dft = cv2.dft(np.float32(img2), flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
magnitude_spectrum1 = 20*np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
plt.subplot(121), plt.imshow(img2, cmap = 'gray')
plt.title('原图'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(magnitude_spectrum1, cmap = 'gray')
plt.title('频谱图'), plt.xticks([]), plt.yticks([])
plt.show()

2. 傅里叶逆变换

(1)基本概念

前面提到,经过傅里叶变换图像可以转化到频域内,那么经过傅里叶逆变换,图像肯定能从频域内转化到时域中,所以傅里叶逆变换就是将信号从频域转化到时域的工具。

(2)代码实现

此处的代码接上面的使用 Numpy 进行傅里叶变换

#傅里叶逆变换
#Numpy实现
ifshift = np.fft.ifftshift(fshift)
# 将复数转为浮点数进行傅里叶频谱图显示
ifimg = np.log(np.abs(ifshift))
if_img = np.fft.ifft2(ifshift)
origin_img = np.abs(if_img)
imggroup = [img2, magnitude_spectrum0, ifimg, origin_img]
titles0 = ['原始图像', '经过移动后的频谱图', '逆变换得到的频谱图', '逆变换得到的原图']
for i in range(4):
    plt.subplot(2, 2, i + 1)
    plt.xticks([])                               #除去刻度线
    plt.yticks([])
    plt.title(titles0[i])
    plt.imshow(imggroup[i], cmap = 'gray')
plt.show()

到此这篇关于基于Python实现图像的傅里叶变换的文章就介绍到这了,更多相关Python图像傅里叶变换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解在Python和IPython中使用Docker

    详解在Python和IPython中使用Docker

    这篇文章主要介绍了详解在Python和IPython中使用Docker,Docker是一个吸引人的新系统,可以用来建立有趣的新技术应用,特别是云服务相关的,需要的朋友可以参考下
    2015-04-04
  • 关于Python中的空值问题及解决

    关于Python中的空值问题及解决

    这篇文章主要介绍了关于Python中的空值问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Python 利用argparse模块实现脚本命令行参数解析

    Python 利用argparse模块实现脚本命令行参数解析

    这篇文章主要介绍了Python 利用argparse模块实现脚本命令行参数解析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • 浅谈python正则的常用方法 覆盖范围70%以上

    浅谈python正则的常用方法 覆盖范围70%以上

    这篇文章主要为大家详细介绍了python正则的常用方法,覆盖范围70%以上,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • python3安装pip3(install pip3 for python 3.x)

    python3安装pip3(install pip3 for python 3.x)

    这篇文章主要为大家详细介绍了install pip3 for python 3.x,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • 基于Python数据结构之递归与回溯搜索

    基于Python数据结构之递归与回溯搜索

    今天小编就为大家分享一篇基于Python数据结构之递归与回溯搜索,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • 利用Python上传日志并监控告警的方法详解

    利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下
    2022-05-05
  • python snap7读写PLC的操作方法

    python snap7读写PLC的操作方法

    这篇文章主要介绍了python snap7读写PLC的操作方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • Python实现对字符串的加密解密方法示例

    Python实现对字符串的加密解密方法示例

    这篇文章主要介绍了Python实现对字符串的加密解密方法,结合实例形式分析了Python使用PyCrypto模块进行DES加密解密的相关操作技巧,需要的朋友可以参考下
    2017-04-04
  • Python tkinter 树形列表控件(Treeview)的使用方法

    Python tkinter 树形列表控件(Treeview)的使用方法

    这篇文章主要介绍了Python tkinter 树形列表控件(Treeview)的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04

最新评论