全网最详细 Python如何读取NIFTI格式图像(.nii文件)和 .npy格式文件和pkl标签文件内容
在醫學圖像處理中,我們經常使用一種NIFTI格式圖像(.nii文件),現在我們來看看
1. NIFTI格式圖像
什么是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)。
為什么會出現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下載地址:http://www.itksnap.org/pmwiki/pmwiki.php?n=Downloads.SNAP3
可以看到: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()?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)?
?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 0filepath = './' # 讀取本代碼同個文件夾下所有的nii格式的文件 filenames = os.listdir(filepath) imgfile = './'slice_trans = []for f in filenames: #開始讀取nii文件s = f[-3:]print(s)if s != '.nii':continues1 = f[:-4]print(s1)imgfile_path = imgfile + s1print("imgfile_path:"+imgfile_path)img_path = os.path.join(filepath, f)img = nib.load(img_path) #讀取niiprint("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.shapeprint("img2:")print(img.shape)else:(x,y,z) = img.shapeprint("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)))任何程序錯誤,以及技術疑問或需要解答的,請添加作者VX:1755337994
?
?
總結
以上是生活随笔為你收集整理的全网最详细 Python如何读取NIFTI格式图像(.nii文件)和 .npy格式文件和pkl标签文件内容的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python基本的信号与槽函数的使用 信
- 下一篇: Python:通过SNMP协议获取华为交