天天看點

如何處理.nii檔案

最近讀了一篇論文[1],是利用深度學習進行MRI圖像重建的,作者在github[2]上提供給我們的他的實作代碼,他使用的一個MRI分割比賽的資料集[3],但是将資料集下載下傳下來發現全部都是.nii格式的檔案,用普通的方法也是打不開的,經過一個星期的摸索,也是大概了解了如何讀取以及處理.nii檔案。

1. NIFTI出現原因

.nii檔案是NIFTI格式的檔案,出現的原因是原來一種圖像格式是ANALYZE 7.5 format,但是這個圖像格式缺少一些資訊,比如沒有方向資訊,病人的左右方位等,如果需要包括額外的資訊,就需要一個額外的檔案,比如ANALYZE7.5就需要一對<.hdr, .img>檔案來儲存圖像的完整資訊。是以,解決這個問題Data Format Working Group (DFWG) 将圖像格式完整的定義為NIFTI(Neuroimaging Informatics Technology Initiative)格式。[4]

2. 讀取.nii檔案

2.1 利用FSL軟體讀取.nii檔案

FSL是一個FMRI, MRI和DTI資料的的分析庫. 支援OSX和linux系統, windows需要在虛拟機運作. 所有的指令可以在指令行調用,也可以通過GUI調用.

因為我是使用Linux系統的,關于Linux系統如何安裝這個軟體,可以參考這篇部落格[5],下面僅僅從直覺上了解一下這個軟體如何打開.nii檔案。

我們可以調用:

fslview 052212_s09_dti.nii

指令來顯示我們想要的圖像。

另外,我們也可以利用FSL資料快視[6],其中一些切片拿出來在html中批量顯示,一個NifTI檔案對應一排切片圖像, 這樣就可以到達快速檢查的目的。

如何處理.nii檔案

2.2 利用matlab處理.nii檔案

網上關于matlab處理.nii檔案說明的都不是很清楚,這裡一步一步講解如何利用matlab讀取.nii檔案。

###2.2.1 準備階段

  1. 首先需要下載下傳一個matlab擴充包: Tools for NIfTI and ANALYZE image[7]。
  2. 因為這個需要matlab賬号,是以需要的可以私聊我。然後就是将這個工具箱安裝好,具體的可以參考這篇文章[8]。 針對大家有需要這個工具包的,為了友善,這裡已經上傳到我的github網站了,Alxemade/NIfTI_20140122
  3. 接下來就是利用這個toolbox處理我們的.nii資料了。

參考程式(matlab代碼):

close all;
clear all;
clc;
nii = load_nii( 'tmp91337586.nii' );  % 裝載.nii資料
img = nii.img;  % 因為這個檔案有img和head二個部分,其中img部分是圖像資料
save image.mat img  % 将資料變成mat格式
load 'image.mat'  % 加載資料
[n1, n2, n3] = size(img);   % 擷取.nii檔案的三個次元,一般1、2維是圖像次元,第三維是切片
% imshow(img(:,:,100),[]);  這個是正常顯示第100個切片的圖像
for i = 1:n3   % 開始切片資料輪尋
    figure(i)   % 開始顯示圖檔
    ti = imshow(img(:,:,i),[]);  % 顯示每一張切片圖像
    pause(0.1);  % 防止顯示過快看不見,簡單延時
end

           

這樣我們就可以顯示.nii檔案了。

2.3 利用python處理nii檔案

python處理主要是利用nibabel這個包。首先我個人的各種包的版本為:

  1. nibabel 2.2.1
  2. tensorflow-gpu 1.2.0
  3. tensorlayer 1.8.3
  4. numpy 1.14.1

一開始我在使用nibabel包中的函數的時候,發現使用

nib.load(img_path).get_data()
           

一直出現錯誤:

raise ValueError('w2 should be positive, but is %e' % w2) ValueError: w2 should be positive, but is -6.401211e-07

而且更要命的是這個錯誤在網上找了好久沒有找到解決辦法,最後在一篇部落格的最後找到了解決相似的問題:

上面解釋說:python3.6/site-packages/nibabel/quaternions.py可能w2_thresh門檻值太過于嚴格,是以我們需要放松一下條件。

解決:我們隻需要在程式開頭加上這樣一句代碼,原來數字是3現在将他改成10,松弛一下條件就不會出錯了!

nib.Nifti1Header.quaternion_threshold = - np.finfo(np.float32).eps * 10  # 注意是負号哦
           

參考程式(python版本)

import tensorlayer as tl
import numpy as np
import os
import nibabel as nib
import threading
import tensorflow as tf
import matplotlib.pyplot as plt
import scipy
from tensorlayer.prepro import *
import skimage.measure

nib.Nifti1Header.quaternion_threshold = - np.finfo(np.float32).eps * 10  # 松弛一下限制
training_data_path = "Training_100"
preserving_ratio = 0.25 # filter out 2d images containing < 25% non-zeros


f_train = tl.files.load_file_list(path=training_data_path,
                                      regx='.*.gz',
                                      printable=False)  # 将test測試集合中的資料以list形式存下來
X_train = []  # 處理訓練集資料
for fi, f in enumerate(f_train):   # 相當于取出下标索引以及list裡面相關的資料
    img_path = os.path.join(training_data_path, f)
    # print(img_path)
    img = nib.load(img_path).get_data()  
    # print(img.shape)
    img_3d_max = np.amax(img)  
    img = img / img_3d_max * 255  # 對所求的像素進行歸一化變成0-255範圍,這裡就是三維資料
    for i in range(img.shape[2]):   # 對切片進行循環
        img_2d = img[:, :, i]  # 取出一張圖像
       # plt.imshow(img_2d) 顯示圖像
       # plt.pause(0.001)
        # filter out 2d images containing < 10% non-zeros
        # print(np.count_nonzero(img_2d))
        #print("before process:", img_2d.shape)
        if float(np.count_nonzero(img_2d)) / img_2d.size >= preserving_ratio:  # 表示一副圖像非0個數超過整副圖像的10%我們才把該圖像保留下來
            img_2d = img_2d / 127.5 - 1  # 對最初的0-255圖像進行歸一化到[-1, 1]範圍之内
            img_2d = np.transpose(img_2d, (1, 0))  # 這個相當于将圖像進行旋轉90度
            # plt.imshow(img_2d)
            # plt.pause(0.01)
            X_train.append(img_2d)
        # print(len(X_train)) 
X_train = np.asarray(X_train, dtype=np.float32)  # 将訓練的圖像資料原來是list現在變成np.array格式
X_train = X_train[:, :, :, np.newaxis]  # 變成4維資料
           

參考文章:

  1. DAGAN: Deep De-Aliasing Generative Adversarial Networks for Fast Compressed Sensing MRI Reconstruction
  2. DAGAN的github位址
  3. MICCAI 2013 grand challenge
  4. NIFTI格式(.Nii)資料version 1格式分析
  5. DTI資料處理: from scanner to statistics
  6. 核磁資料處理之: FSL資料快視
  7. Tools for NIfTI and ANALYZE image
  8. 給Matlab添加工具箱Toolbox的方法

繼續閱讀