使用Python解压缩.gz格式的Nifti医学图像

3

我希望在Python中解压一批nii.gz文件,以便稍后可以在sitk中处理它们。当我手动解压单个文件并右键单击文件选择“提取..”时,sitk可以正确地解释该文件(我使用sitk.ReadImage(unzipped))。但是,当我尝试使用以下代码在Python中解压它时:

with gzip.open(segmentation_zipped, "rb") as f:
    bindata = f.read()
segmentation_unzipped = os.path.join(segmentation_zipped.replace(".gz", ""))
with gzip.open(segmentation_unzipped, "wb") as f:
    f.write(bindata)

当sitk尝试读取文件时,我遇到了错误:

运行时错误:在SimpleITK ReadImage中抛出异常:C:\d\VS14-Win64-pkg\SimpleITK\Code\IO\src\sitkImageReaderBase.cxx:82: sitk::ERROR: 无法确定"E:\BraTS19_2013_10_1_seg.nii"的ImageIO阅读器

还有一种稍微不同的方法也会出现问题:

input = gzip.GzipFile(segmentation_zipped, 'rb')
s = input.read()
input.close()

segmentation_unzipped = os.path.join(segmentation_zipped.replace(".gz", ""))
output = open(segmentation_unzipped, 'wb')
output.write(s)
output.close()

我理解为: 运行时错误: SimpleITK ReadImage 中出现异常: C:\d\VS14-Win64-pkg\SimpleITK-build\ITK\Modules\IO\PNG\src\itkPNGImageIO.cxx:101: itk::ERROR: PNGImageIO(0000022E3AF2C0C0): 读取文件头失败: 原因: fread 只读取了 0 而不是 8

有人能帮忙吗?


1
很奇怪你从SimpleITK中出现错误,因为在你展示的代码中并没有用SimpleITK读取图像。请注意,SimpleITK.ReadImage可以直接读取'.nii.gz'文件而不需要解压缩。 - Dave Chen
1个回答

4
不需要解压Nifti图像,例如Nibabel库可以在不解压缩的情况下处理它。
#==================================
import nibabel as nib
import numpy as np
import matplotlib.pyplot as plt
#==================================
# load image (4D) [X,Y,Z_slice,time]
nii_img  = nib.load('path_to_file.nii.gz')
nii_data = nii_img.get_fdata()

fig, ax = plt.subplots(number_of_frames, number_of_slices,constrained_layout=True)
fig.canvas.set_window_title('4D Nifti Image')
fig.suptitle('4D_Nifti 10 slices 30 time Frames', fontsize=16)
#-------------------------------------------------------------------------------
mng = plt.get_current_fig_manager()
mng.full_screen_toggle()

for slice in range(number_of_slices):
    # if your data in 4D, otherwise remove this loop
    for frame in range(number_of_frames):
        ax[frame, slice].imshow(nii_data[:,:,slice,frame],cmap='gray', interpolation=None)
        ax[frame, slice].set_title("layer {} / frame {}".format(slice, frame))
        ax[frame, slice].axis('off')

plt.show() 

或者您可以按照以下方式使用SimpleITK:
import SimpleITK as sitk
import numpy as np

# A path to a T1-weighted brain .nii image:
t1_fn = 'path_to_file.nii'

# Read the .nii image containing the volume with SimpleITK:
sitk_t1 = sitk.ReadImage(t1_fn)

# and access the numpy array:
t1 = sitk.GetArrayFromImage(sitk_t1)

谢谢你的回答!那正是我想要做的:我真的想使用Simple ITK来读取图像,但我有很多个nii.gz文件。这就是为什么我希望能够在Python中解压它们以便使用Simple ITK。我尝试使用Simple ITK读取nii.gz格式的图像,但效果是:运行时错误:在SimpleITK ReadImage中抛出异常:C:\d\VS14-Win64-pkg\SimpleITK\Code\IO\src\sitkImageReaderBase.cxx:82: sitk::ERROR: 无法确定"\BraTS19_2013_10_1_seg.nii.gz"的ImageIO阅读器。 - Biba
@ Biba,但是SimpleITK可以读取压缩格式!sitk_3D = sitk.ReadImage( os.path.join(DIR_DATA, "3D_Brain_Source.nii.gz")) - Bilal
当我尝试使用itk读取压缩的nifti文件时,出现了以下错误:运行时错误:SimpleITK ReadImage中抛出异常:C:\d\VS14-Win64-pkg\SimpleITK\Code\IO\src\sitkImageReaderBase.cxx:82: sitk::ERROR:无法确定"Brats19_2013_10_1_seg.nii.gz"的ImageIO读取器。当我手动解压文件(右键单击->提取文件),然后使用itk读取文件时,文件被正确读取。 - Biba
抱歉!你的解决方案实际上起作用了,结果发现路径有些问题:我改成了简单的D:\BraTS19_2013_10_1_seg.nii.gz,一切都运行良好!谢谢你的帮助! - Biba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接