pytorch傅里叶变换与反变换,获取图像的功率谱和相位谱

第一张图为功率谱,第二张图为相位谱,第三张图为反变换结果

全部代码如下

import torch
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np


# norm='backward' 'ortho'
def fft(image, shift=True, norm='backward', rfft=False):
    r'''
    image:[b,c,h,w]
    return:[b,c,h,w],[b,c,h,w] 
    norm = "backward", "forward", "ortho", None
    '''
    if rfft:
        fft_image = torch.fft.rfft2(image, norm=norm)
    else:
        fft_image = torch.fft.fft2(image, norm=norm)

    if shift and not rfft:
        fft_image = torch.fft.fftshift(fft_image + 1e-8)
    return torch.abs(fft_image), torch.angle(fft_image)


def ifft(magnitude, phase, shift=True, norm='backward', rfft=False):
    r'''
    magnitude:[b,c,h,w],phase:[b,c,h,w]
    return:[b,c,h,w]
    norm = "backward", "forward", "ortho", None
    '''
    if shift and not rfft:
        magnitude = torch.fft.ifftshift(magnitude)
        phase = torch.fft.ifftshift(phase)
    complex_spectrum = torch.complex(
        magnitude * torch.cos(phase) + 1e-8, magnitude * torch.sin(phase) + 1e-8) + 1e-8
    return torch.fft.irfft2(complex_spectrum, norm=norm).real if rfft else torch.fft.ifft2(complex_spectrum,
                                                                                           norm=norm).real


if __name__ == '__main__':
    # read image
    print("hello")
    image = Image.open('RGB_tif_R47C9.tif')
    image = torch.from_numpy(np.array(image)) / 255
    image = torch.unsqueeze(image.permute(2, 0, 1), 0)
    
    mag_image, pha_image = fft(image, shift=True)

    image2 = ifft(mag_image, pha_image, shift=True)
    #
    plt.subplot(1, 3, 1), plt.imshow(torch.log(1 + mag_image[0][0]))
    plt.subplot(1, 3, 2), plt.imshow(pha_image[0][0])
    plt.subplot(1, 3, 3), plt.imshow(
        image2[0].permute(1, 2, 0).clamp(0., 1.).numpy())
    plt.show()

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
PyTorch中对于傅立叶变换的实现可以使用torch.fft模块。其中torch.fft.fft()函数可以用来进行一维傅立叶变换,torch.fft.fft2()函数可以用来进行二维傅立叶变换,而torch.fft.fftn()函数可以用来进行n维傅立叶变换。这些函数的输入应该是实数或复数张量,并且返回的结果也是复数张量。 如果需要计算傅立叶逆变换,可以使用torch.fft.ifft()函数进行一维逆变换,torch.fft.ifft2()函数进行二维逆变换,torch.fft.ifftn()函数进行n维逆变换。同样,这些函数的输入和输出都是复数张量。 在PyTorch中,可以使用torch.fft.fftshift()函数来对转换后的频域图像进行移动操作,将低频部分放到图像中间,以便于观察。这个函数仅仅起到了视觉上的作用。 另外,还有cv2.dft()函数可以用于图像的傅立叶变换,注意输入数据的格式应为float32。而cv2.idft()函数则可以进行图像的傅立叶逆变换。需要注意的是,使用np.fft.fft2()进行图像傅立叶变换时,数据应为非负,否则用np.fft.ifft2()无法还原。 除了傅立叶变换,还有一种类似于傅立叶变换变换方法叫做小波变换。小波变换也是将函数用一组正交基函数展开的方法,不同之处在于选取的基函数不同。 关于PyTorch中的傅立叶变换,在进行逆变换时,可以使用torch.irfftn()函数来计算出逆变换结果。然后,可以通过裁剪出多余的数组填充来得到最终的逆变换结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [分别使用numpy和pytorch进行图像傅里叶变换和频域分析](https://blog.csdn.net/Brikie/article/details/113004911)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [详解python实现小波变换的一个简单例子](https://download.csdn.net/download/weixin_38574132/13997641)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [PyTorch中的傅立叶卷积:通过FFT有效计算大核卷积的数学原理和代码实现](https://blog.csdn.net/m0_46510245/article/details/109800521)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值