python 傅里叶变换_利用Python对图像进行傅里叶变换

本文介绍如何使用Python的Numpy库对CT图像进行傅里叶变换,生成幅度和相位图像,并通过matplotlib进行显示。还讨论了逆傅里叶变换的过程,以重新获取接近原始图像的结果。在傅里叶变换后,利用LogNorm进行对数处理以更好地显示图像,最终通过ifft2和ifftshift恢复图像,证实了变换后与原图的像素差异极小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文中利用Numpy包对CT图像进行傅里叶变换,生成幅度和相位图。最后再通过逆傅里叶变换重新得到CT图像。

1. 打开Jupyter notebook后,先导入以下科学包
import numpy as npimport mathimport pydicomimport osimport matplotlib.pyplot as plt
2. 利用load_scan()和get_pixels_hu()函数读取CT文件。如果对这两个函数不清楚,可以参看篇推文《利用Python打开DICOM CT文件》
# open CT_lung datasetdir_path_ct = './Data/HNSCC_01/'patient_ct = load_scan(dir_path_ct)imgs_ct = get_pixels_hu(patient_ct)# For "NotImplementedError: this transfer syntax JPEG 2000 Image Compression, # can not be read because Pillow lacks the jpeg 2000 decoder plugin"# https://pydicom.github.io/pydicom/stable/tutorials/installation.html#installing-pillow
3. 利用np.fft.fft2()对图像进行傅里叶变换
# Fourier Transferfrom matplotlib.colors import LogNorm# CTct_ft = np.fft.fft2(imgs_ct[9])imgs_ct_ft = np.fft.fftshift(ct_ft) # Shift the zero-frequency component to the center of the spectrum.imgs_ct_magnitude = np.abs(imgs_ct_ft)imgs_ct_phase =np.arctan2(np.imag(imgs_ct_ft), np.real(imgs_ct_ft)) * 180 / np.pi

np.fft.fft2()的返回值为复数。根据复数的实部与虚部可以得到幅度(imgs_ct_magnitude )和相位(imgs_ct_phase )信息。

np.fft.fftshift()对频域谱进行移动使零频率分量位于频谱中心。这更符合通常所见的频域图像习惯。

4. 利用matplotlib.pyplot绘制幅度和相位图像。由于图像单个像素点的值范围很大,不利于直观表现,所以利用norm = LogNorm()进行对数处理。

plt.figure(figsize=(10, 10))plt.subplot(121)plt.title('CT Slice_10 (Magnitude)')plt.imshow(imgs_ct_magnitude, cmap='gray', norm = LogNorm()) # we apply a logarithmic transformation here to better display the dynamic range of the magnitudeplt.subplot(122)plt.title('CT Slice_10 (Phase)')plt.imshow(imgs_ct_phase, cmap='gray')plt.show()

2a4c49651056f7d34a2b18fcd65e592f.png

5. 利用np.fft.ifft2()进行逆傅里叶变换。注意要利用np.fft.ifftshift()还原频域谱

# inverse Fourier transform# CTimgs_ct_ift = np.fft.ifftshift(imgs_ct_ft)ct_ift = np.real(np.fft.ifft2(imgs_ct_ift))ct_ift = ct_ift.astype(np.int16)

np.fft.ifft2()返回值同样是一个复数,但是虚部值基本为0,这里直接使用实部作为逆傅里叶变换后的图像。

6. 利用matplotlib.pyplot绘制图像

plt.figure(figsize=(10, 10))plt.subplot(131)plt.title('CT Slice_10 (Origin)')plt.imshow(imgs_ct[10], cmap='gray')plt.subplot(132)plt.title('CT Slice_10 (Inverse FT)')plt.imshow(ct_ift, cmap='gray') # we apply a logarithmic transformation here to better display the dynamic range of the magnitudeplt.subplot(133)plt.title('Orgin - Reconstructed')plt.imshow(np.round(imgs_ct[10] - ct_ift), cmap='gray')plt.show()

bcd94e35808478e7d206e01ecc764e67.png

直观上可以看到,重新得到的图像与原图之间有一定差别,但通过np.max(imgs_ct[9] - ct_ift)得到结果为1,这表示像素点间的差别很小(最大仅为1),所以可以认为重新得到的图像基本等于原图。

看完本文有收获?请分享给更多人

推荐阅读

8160e42fed107d425344eb5963260aa9.png

c23228c790abfa9403485add2dd44d15.png

f341646795f9b20f550a2d8ed4b71cac.png

未经授权不得转载 如有需要请添加助手微信 PI3_141592653

cdd9e562f49c045a91375530760de488.png

4335809c59b528588a06d8adca96ed6c.png

关注「质子重离子放疗」公众号

与中国物理师一同成长

23444e3a8b357f6ef8b602518241b779.png

### 回答1: 傅立叶变换是一种将时域信号转换为频域信号的数学方法。在图像处理中,傅立叶变换可以将图像转换为频域表示,从而方便进行滤波、压缩、特征提取等操作。Python中的numpy库提供了傅立叶变换的实现,可以通过numpy.fft模块中的fft2函数对图像进行二维傅立叶变换。傅立叶变换的结果是一个复数数组,其中每个元素表示对应频率的幅度和相位信息。可以通过numpy.fft模块中的ifft2函数将频域信号转换回时域信号。 ### 回答2: 傅里叶变换是一种数学技术,可以将一个信号分解为一系列简单的正弦和余弦波。在图像处理中,傅里叶变换可以将图像从空间域(像素表示)转换为频率域(幅度和相位表示),这有助于我们更好地理解图像特征和纹理、去噪和压缩图像等任务。 Python中,我们可以使用SciPy库中的fftpack模块来执行傅里叶变换。该模块提供了许多函数,如fft2(二维离散傅里叶变换)和ifft2(逆变换),可以在频域和空间域之间进行转换。我们可以使用matplotlib和numpy库来可视化和处理变换后的图像。 一般来说,我们首先需要将图像的灰度值归一化为0到1之间的值,然后使用fft2函数对其执行傅里叶变换,得到频谱表示。这个频谱表示实际上是由正弦和余弦波的幅度和相位组成的。我们可以使用numpy库中的abs函数和angle函数来提取幅度和相位信息。然后可以使用这些信息来进行图像处理,例如滤波或重建。 在进行滤波时,我们需要在频率域中选择要过滤的频率范围并将其设置为零,或者对频率范围之外的值进行放大或缩小。然后,我们可以使用ifft2函数将滤波后的频谱转换回空间域,得到过滤后的图像。 在图像处理中,傅里叶变换可以帮助我们更好地理解图像的特征和纹理,去除图像中的噪声和压缩图像等任务。使用Python中的SciPy库和matplotlib和numpy库的组合,我们可以轻松地执行傅里叶变换和相应的图像处理任务。 ### 回答3: 傅立叶变换是一种将信号从时间域转换到频率域的算法,常用于图像处理领域。在图像处理中,图像可以看做是一个二维信号,因此需要使用二维傅立叶变换。 二维傅立叶变换将图像从空间域转换到频率域,即将每个像素点的灰度值表示为从低频到高频的复杂振幅和相位的组合。低频表示图像中变化平缓的部分,高频表示图像中变化快速的部分。 在Python中,可以使用NumPy库中的fft2()函数来进行二维傅立叶变换。首先需要将图像转换为灰度图,并将其表示为一个矩阵。然后使用fft2()函数对矩阵进行傅立叶变换,得到一个与输入矩阵大小相同的复数数组。 为了可视化结果,可以使用fftshift()函数将频率最低点移到中心,并使用log()函数将结果取对数。最后使用imshow()函数将频谱图显示出来,可以清晰地看到图像中各个部分的频率分布情况。 在进行频域处理之后,可以使用ifft2()函数将得到的结果逆变换回空间域,得到处理后的图像。同时,也可以进行各种基于频域的图像处理操作,如滤波、去噪等。 总之,利用Python进行图像的傅立叶变换可以提取图像的频域特征,为后续的图像处理和分析提供基础。同时,Python强大的科学计算库和便捷的语法结构也为图像处理带来了更加高效和方便的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值