您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch |

自学教程:python使用SimpleITK 和 Nibabel 读取医学图像 nii 数据并保存为图片

51自学网 2020-10-31 12:28:28
  python
这篇教程python使用SimpleITK 和 Nibabel 读取医学图像 nii 数据并保存为图片写得很实用,希望能帮到您。

SimpleITK 和 Nibabel 的区别:

SimpleITK 加载数据是channel_first,即(155,240,240);

Nibabel 是 channel_last,即(240,240,155),其中155是图像通道数,也就是155张图像,可以把nii看成二维图像,也可以看成三维。

But  nibabel加载出来的图像被旋转了90度,横过来了,不知道什么原因~亟待解决~

  • SimpleITK

 
  1.  
    import SimpleITK as sitk
  2.  
    import skimage.io as io
  3.  
     
  4.  
    def read_img(path):
  5.  
    img = sitk.ReadImage(path)
  6.  
    data = sitk.GetArrayFromImage(img)
  7.  
    return data
  8.  
    #显示一个系列图
  9.  
    def show_img(data):
  10.  
    for i in range(data.shape[0]):
  11.  
    io.imshow(data[i,:,:], cmap = 'gray')
  12.  
    print(i)
  13.  
    io.show()
  14.  
     
  15.  
    #单张显示
  16.  
    def show_img(ori_img):
  17.  
    io.imshow(ori_img[60], cmap = 'gray')
  18.  
    io.show()
  19.  
     
  20.  
    path = 'F:/my_data/t1ce.nii.gz' #数据所在路径
  21.  
    data = read_img(path)
  22.  
    show_img(data)
  23.  
     
  • Nibabel

 
  1.  
    import nibabel as nib
  2.  
    import matplotlib.pyplot as plt
  3.  
     
  4.  
    def read_data(path):
  5.  
    image_data = nib.load(path).get_data()
  6.  
    return image_data
  7.  
     
  8.  
    def show_img(ori_img):
  9.  
    plt.imshow(ori_img[:,:,85], cmap = 'gray') #channel_last
  10.  
    plt.show()
  11.  
     
  12.  
    path = 'F:/my_data/t1ce.nii.gz'
  13.  
    data = read_data(path)
  14.  
    show_img(data)


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

这里介绍将多个nii文件(保存在一个文件夹下)转换成png图像。且图像单个文件夹的名称与nii名字相同。



 
  1.  
    import numpy as np
  2.  
    import os #遍历文件夹
  3.  
    import nibabel as nib #nii格式一般都会用到这个包
  4.  
    import imageio #转换成图像
  5.  
     
  6.  
    def nii_to_image(niifile):
  7.  
    filenames = os.listdir(filepath) #读取nii文件夹
  8.  
    slice_trans = []
  9.  
     
  10.  
    for f in filenames:
  11.  
    #开始读取nii文件
  12.  
    img_path = os.path.join(filepath, f)
  13.  
    img = nib.load(img_path) #读取nii
  14.  
    img_fdata = img.get_fdata()
  15.  
    fname = f.replace('.nii','') #去掉nii的后缀名
  16.  
    img_f_path = os.path.join(imgfile, fname)
  17.  
    #创建nii对应的图像的文件夹
  18.  
    if not os.path.exists(img_f_path):
  19.  
    os.mkdir(img_f_path) #新建文件夹
  20.  
     
  21.  
    #开始转换为图像
  22.  
    (x,y,z) = img.shape
  23.  
    for i in range(z): #z是图像的序列
  24.  
    silce = img_fdata[i, :, :] #选择哪个方向的切片都可以
  25.  
    imageio.imwrite(os.path.join(img_f_path,'{}.png'.format(i)), silce)
  26.  
    #保存图像
  27.  
     
  28.  
    if __name__ == '__main__':
  29.  
    filepath = 'nii的文件夹'
  30.  
    imgfile = 'image的文件夹'
  31.  
    nii_to_image(filepath)

代码是我自己写的,用于处理ADNI的nii格式完全有效。

有问题欢迎指教,一起进步哟!

 

这几天总有人问问题,这里总结一下常见问题:

1.出现warning不要紧,数据集处理得没问题就行(个人观点);

2.(x,y,z) = img.shape会报错,

这是因为不同的 nii 的shape不同,比如有的是(256,256,155,1),有的是(256,256,155),这时候先查询nii文件的信息(查询代码:https://blog.csdn.net/weixin_43330946/article/details/91538695),然后修改成(x,y,z,_)、(x,y)就可以了。如果文件夹中nii的shape有多种可能,写一个 if 语句就可以啦。


 


深度学习训练时利用python处理nii文件
Ubuntu查看当前文件夹路径
51自学网,即我要自学网,自学EXCEL、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。
京ICP备13026421号-1