Img2Fourier2Img图像转化成频域还能完全恢复回图像域吗?

心血来潮,想看看Brain MRI Img变到频域再变回来能不能复原,于是尝试了一下
结论是:
在同一个程序中进行Img2Fourier2Img是没有问题的(Img像素值在小数点后很多很多位才开始不一样的),
但是如果把频域图像保存,加载的时候需要说明要加载复数(不然读取的时候会去掉频率图像的虚部,从而恢复不出原始图像)。

import nibabel as nib
import numpy as np

img = nib.load(r'BrainMRI.nii.gz')
data = img.get_fdata()
# Img2Fourier
fft_data = np.fft.fftn(data) 
fft_img = nib.Nifti1Image(fft_data, img.affine)
nib.save(fft_img, r'fft_image.nii')
print("频率域数据已保存")
# Fourier2Img
ifft_data = np.fft.ifftn(fft_data).real 
ifft_img = nib.Nifti1Image(ifft_data, img.affine)
nib.save(ifft_img, r'ifft_image.nii')
print("图像域数据已保存")

# 读保存的频率域数据
fft_img2 = nib.load(r'fft_image.nii')
fft_data2 = fft_img2.get_fdata(dtype=np.complex64) # 这个时候频率域的数据保留了虚部
img_data2 = np.fft.ifftn(fft_data2).real
img2 = nib.Nifti1Image(img_data2, fft_img2.affine)
nib.save(img2, r'ifft_image2.nii')
print("图像域数据2已保存")

# 比较未保存的fft_data和读取的fft_data2的差别
# a = np.array_equal(fft_data, fft_data2)
# print(a)
# 找出不同的位置
# diff_positions = np.where(fft_data != fft_data2)
# print("不同的位置:", diff_positions)
# # 打印不同的元素
# for pos in zip(*diff_positions):
#     print(f"第{pos[0]}行,第{pos[1]}列:array1[{pos}] = {fft_data[pos]}, array2[{pos}] = {fft_data2[pos]}")

测试一下原图,mg2Fourier2Img保存的图,和Img2Fourier保存再加载2Img保存的图

nii1 = nib.load(r'BrainMRI.nii.gz') # 原图
nii2 = nib.load(r'ifft_image.nii')  # Img2Fourier2Img保存的图
nii3 = nib.load(r'ifft_image2.nii') # Img2Fourier保存再加载2Img保存的图
data1 = nii1.get_fdata()
data2 = nii2.get_fdata()
data3 = nii3.get_fdata()

# 检查数组是否相等
a = np.array_equal(data1, data2)
print(a)
# 找出不同的位置
diff_positions = np.where(data1 != data2)
print("不同的位置:", diff_positions)
# 打印不同的元素
for pos in zip(*diff_positions):
    print(f"第{pos[0]}行,第{pos[1]}列:array1[{pos}] = {data1[pos]}, array2[{pos}] = {data2[pos]}")

b = np.array_equal(data1, data3)
c = np.array_equal(data2, data3)
print(a,b,c)

结果显示,a,b,c都是false,打印出来看发现小数点后很多位才开始不一样,所以可视化看着无差别。
array1[(12, 62, 69)] = 4.541336602414958e-05,
array2[(12, 62, 69)] = 4.541336602420509e-05

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值