全网最详细 Python如何读取NIFTI格式图像(.nii文件)和 .npy格式文件和pkl标签文件内容

发布时间:2024-11-04 17:01

在医学图像处理中,我们经常使用一种NIFTI格式图像(.nii文件),现在我们来看看

  1. 什么是.nii文件?
  2. 该如何读取.nii文件?

1. NIFTI格式图像

  1. 什么是NIFTI(Neuroimaging Informatics Technology Initiative)格式图像?
    在讲解什么是NIFTI格式之前,得先了解一下Analyze格式。Analyze格式储存的每组数据组包含2个文件,一个为数据文件,其扩展名为.img,包含二进制的图像资料;另外一个为头文件,扩展名为.hdr,包含图像的元数据。在fMRI的早期,Analyze格式最常用的格式,但现在逐渐被NIFTI格式所取代。Analyze格式主要不足就是头文件不能真正反映元数据。
    标准NIFTI图像的扩展名是.nii,也包含了头文件及图像资料。由于NIFTI格式和Analyze格式的关系,因此NIFTI格式也可使用独立的图像文件(.img)和头文件(.hdr)。单独的.nii格式文件的优势就是可以使用标准的压缩软件(如gzip)进行压缩,而且一些分析软件包(比如FSL)可以直接读取和写入压缩的.nii文件(扩展名为.nii.gz)。

  2. 为什么会出现NIFTI格式图像?
    原来的ANALYZE 7.5 format图像格式缺少一些信息,比如没有方向信息,病人的左右方位等,如果需要包括额外的信息,就需要一个额外的文件,比如ANALYZE 7.5就需要一对<.hdr, .img>文件来保存图像的完整信息。因此,解决这个问题Data Format Working Group (DFWG) 将图像格式完整的定义为NIFTI格式。

详细了解NIFTI格式请参见: https://brainder.org/2012/09/23/the-nifti-file-format/

2. 读取NIFTI格式图像

2.1 ITK-SNAP

推荐ITK-SNAP下载地址:ITK-SNAP Version 3.x Downloads
在这里插入图片描述
可以看到:itk-snap获得了分别来自三个角度的视图(水平面、矢状面、冠状面)
在这里插入图片描述

2.2  Python读取npy文件代码

import os
image = np.load('/content/drive/MyDrive/coursework1-data/2D_projection_R_sub-0.npy', encoding='bytes')
print(image.shape)
A = image[:, :, 0]
B = image[:, :, 1]
C = image[:, :, 2]
plt.imshow(A)
plt.show()
plt.imshow(B)
plt.show()
plt.imshow(C)
plt.show()

全网最详细 Python如何读取NIFTI格式图像(.nii文件)和 .npy格式文件和pkl标签文件内容_第1张图片

 2.3  Python读取pkl文件代码

file_path='/content/drive/MyDrive/Colab Notebooks/Training_meta.pkl'
meta_path=os.path.join(file_path)
meta=pd.read_pickle(meta_path)
print(meta)

全网最详细 Python如何读取NIFTI格式图像(.nii文件)和 .npy格式文件和pkl标签文件内容_第2张图片

 2.4  Python读取nii文件代码并保存成png格式图片

import numpy as np
import os #遍历文件夹
import nibabel as nib #nii格式一般都会用到这个包
import imageio #转换成图像
from PIL import Image
np.set_printoptions(threshold=np.inf)
def nii_to_image(niifile):
  return 0

filepath = './' # 读取本代码同个文件夹下所有的nii格式的文件
filenames = os.listdir(filepath)
imgfile = './'

slice_trans = []

for f in filenames:  #开始读取nii文件
  s = f[-3:]
  print(s)
  
  if s != '.nii':
    continue
  s1 = f[:-4]
  print(s1)
  imgfile_path = imgfile + s1
  print("imgfile_path:"+imgfile_path)
  img_path = os.path.join(filepath, f)
  img = nib.load(img_path) #读取nii
  print("img:")
  print(img)
  img_fdata = img.get_fdata()

  fname = f.replace('.nii','') #去掉nii的后缀名
  img_f_path = os.path.join(imgfile, fname)
  if not os.path.exists(img_f_path):
    os.mkdir(img_f_path)

#创建nii对应的图像的文件夹
# # if not os.path.exists(img_f_path):
# os.mkdir(img_f_path) #新建文件夹
# #开始转换为图像
  if '.gz' in s1:
    (x, y, z, _) = img.shape
    print("img2:")
    print(img.shape)
  else:
    (x,y,z) = img.shape
    print("img3:")
    print(img.shape)

  for i in range(z): #z是图像的序列
    silce = img_fdata[:, :, i] #选择哪个方向的切片都可以
    imageio.imwrite(os.path.join(img_f_path,'{}_mask.png'.format(i)), silce)
    img = Image.open(os.path.join(img_f_path,'{}_mask.png'.format(i)))
    img.save(os.path.join(img_f_path,'{}_mask.png'.format(i)))

任何程序错误,以及技术疑问或需要解答的,请添加

全网最详细 Python如何读取NIFTI格式图像(.nii文件)和 .npy格式文件和pkl标签文件内容_第3张图片

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号