標註工具
標註工具推薦使用ITK-SNAP,windows、linux和MacOS平臺都支援。
標註的讀取
通過ITK-SNAP載入資料和label檔案,我們可以看到用不同顏色區分的標註,如下圖:
圖中有兩個label,分別為Label1和Label2,對應圖中紅色和綠色部分。
下面我們用程式讀取label檔案,看看具體的資料結構是怎樣的。
import numpy as np
import SimpleITK as sitk
label_path = "./hippocampus_001_label.nii.gz"
if __name__ == "__main__":
img_itk = sitk.ReadImage(label_path)
img_npy = sitk.GetArrayFromImage(seg_itk)
print("=======label shape=======")
print(img_npy.shape)
print("=======label value=======")
print(img_npy[img_npy != 0])
結果如下:
=======label shape=======
(35, 51, 35)
=======label value=======
[1 1 1 ... 2 2 2]
程式中我們首先通過itk讀取影像,並轉換為numpy陣列,之後列印了陣列的shape,以及陣列中不為0的其餘的數值,從以上結果我們可以看到,標註部分的具體的數值等於Label的數值。
標註的修改
有時我們會涉及到對Label的修改,比如我們想將Label1刪除,將Label2的Value改為1。程式碼如下:
img_npy[img_npy == 1] = 0
img_npy[img_npy == 2] = 1
img_itk = sitk.GetImageFromArray(img_npy)
sitk.WriteImage(img_itk, label_path)
print("=======changed label value=======")
print(img_npy[img_npy != 0])
結果如下:
=======label value=======
[1 1 1 ... 1 1 1]
我們用ITK-SNAP載入修改後的影像,如下圖,與本文第一張圖對比,可以看到標註部分已經修改成功。
其它實現方式
採用nibabel代替SimpleITK的另一種實現Label讀取和修改的方式,也能完成相同的工作。
# encoding = utf-8
import nibabel as nib
import numpy as np
label_path = "./hippocampus_001_label.nii.gz"
if __name__ == "__main__":
img_nib = nib.load(label_path)
img_npy = img_nib.get_fdata()
print("=======label shape=======")
print(img_npy.shape)
print("=======label value=======")
print(img_npy[img_npy != 0])
img_npy[img_npy == 1] = 0
img_npy[img_npy == 2] = 1
nib.save(nib.Nifti1Image(img_npy.astype('uint8'), affine=img_nib.affine), label_path)
print("=======changed label value=======")
print(img_npy[img_npy != 0])