Python怎么做图像的傅里叶变换和逆变换
Admin 2022-05-28 群英技术资讯 725 次浏览
首先是本文总体代码,改一下图像的读取路径就可以运行了,但我还是建议大家先看后面的步骤一行行敲代码,这样效果更好:
""" 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()
一般我们观察信号是直接在时域内(声音信号)或者空间内(图像)对其进行分析,这样虽然符合常理,但信号中的一些有用的条件就不会被我们考虑进去,从而达不到分析的效果,所以我们要将信号转化到其他的一些变换域中进行分析。
本系列文章经典操作:
""" 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
代码参考:OpenCV官网
当我们描述一段声音时,我们不仅会说它的音量的大小如何,还有可能会说它的频率是高的还是低的,那么我们该怎么理解频率这个概念呢?以前学习三角函数时我们被告知每一个正弦信号有它的固定的频率,就是它的周期的倒数。那么什么是频域呢?我们也接触过其他形状的波形,比如方波、三角波等等,而这些不同形状的波呢,就是用一个个频率不相同的正弦波组成的,如果我们将那些不同频率的正弦波按照它们的频率大小排列起来,就得到了一个频率轴(这是一维的),然后我们将各个频率对应的幅度值给它们对应起来(就像xoy平面一样)得到的二维的平面,就是频域了。傅里叶变换就是将信号从时域转化到频域的一个工具。对于傅里叶变换中的的理解可以参考下面的图片:
当然如果你想更加深入的了解傅里叶变换,你可以按照图片上的水印去搜索,他那里讲的非常清晰。
#将图像转化到频域内并绘制频谱图 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()
#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()
前面提到,经过傅里叶变换图像可以转化到频域内,那么经过傅里叶逆变换,图像肯定能从频域内转化到时域中,所以傅里叶逆变换就是将信号从频域转化到时域的工具。
此处的代码接上面的使用 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()
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要给大家分享python中的四个高级数据类型,分别是字符,元组,列表,字典,下文实例介绍的很详细,对大家学习和理解python数据类型有一定的帮助,有需要的朋友可以参考,接下来跟随小编一起学习一下吧。
对于中文乱码的情况很多朋友在编程过程中都有遇到,因此这篇文章就主要给大家分享的是有关python出现中文乱码怎样解决的方法。小编觉得挺实用的,因此分享给大家做个参考,感兴趣的朋友就继续往下看吧。
本文主要介绍了Python手写回归树的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
本文给大家分享了作者整理的五个python游戏开发的案例,通过具体设计思路,代码等方面详细了解python游戏开发的过程,非常的详细,希望大家能够喜欢
当我们处理图像的时候避免不了要对访问,或是读取某一个像素点的值,下面这篇文章主要给大家介绍了关于利用Python如何获取图像中像素点坐标的相关资料,需要的朋友可以参考下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008