醫學圖像數據讀取及預處理方法總結


創建日期: 2020-03-11 16:59:10

這兩天又重新回顧了一下醫學圖像數據的讀取和預處理方法,在這里總結一下。

基於深度學習做醫學圖像數據分析,例如病灶檢測、腫瘤或者器官分割等任務,第一步就是要對數據有一個大概的認識。但是我剛剛入門醫學圖像分割的時候,很迷茫不知道自己該干啥,不知道需要准備哪些知識,慢慢到現在才建立了一個簡陋的知識體系。個人認為,比如說醫學圖像分割這個方向,再具體一點比如腹部器官分割或者肝臟腫瘤分割,需要掌握兩方面的知識:(1)醫學圖像預處理方法;(2)深度學習知識。而第一點是進行第二點的必要條件,因為你需要了解輸入到DL網絡中的到底是長啥樣的數據。

這篇文章主要介紹常見的醫學圖像讀取方式和預處理方法。

1. 醫學圖像數據讀取

1.1 ITK-SNAP軟件

首先介紹一下醫學圖像可視化軟件ITK-SNAP,可以作為直觀感受醫學圖像3D結構的工具,也可以用來做為分割和檢測框標注工具,免費,很好用,安利一下:ITK-SNAP官方下載地址。此外,mango是另一個非常輕量的可視化軟件,也可以試試。我一般用ITK-SNAP。

ITK-SNAP的使用方法可以參考大佬的這篇博文,講的很簡潔:

JunMa:ITK-SANP使用入門

img

ITK-snap界面

首先要明確一下和人體對應的方向,其中三個窗口對應三個切面,對應關系如下圖所示,按照字母索引即可。例如,左上圖對應R-A-L-P這個面,是從腳底往頭部方向看的切面(即z方向),另外兩張類似。

img

紅色切面為矢狀面,紫色切面為冠狀面,綠色切面為橫斷面

也可以同時將分割結果導入,對比觀察。

img

對於標注不太嚴謹的地方也可以精細化修改。當然公開集的話,絕大多數都挺好的。自己標注也是類似。(如果顯示不太清晰,對比度太低,需要在軟件中調節窗寬和窗位)

1.2 SimpleITK

我們知道,最常見的醫學圖像有CT和MRI,這都是三維數據,相比於二維數據要難一些。而且保存下來的數據也有很多格式,常見的有.dcm .nii(.gz) .mha .mhd(+raw)。這些類型的數據都可以用Python的SimpleITK來處理,此外pydicom可以對.dcm文件進行讀取和修改。

讀取操作的目的是從每一個病人數據中抽取tensor數據,用Simpleitk讀取上面的.nii數據為例:

import numpy as np
import os
import glob
import SimpleITK as sitk
from scipy import ndimage
import matplotlib.pyplot as plt  # 載入需要的庫

# 指定數據root路徑,其中data目錄下是volume數據,label下是segmentation數據,都是.nii格式
data_path = r'F:\LiTS_dataset\data'
label_path = r'F:\LiTS_dataset\label'  

dataname_list = os.listdir(data_path)
dataname_list.sort()
ori_data = sitk.ReadImage(os.path.join(data_path,dataname_list[3])) # 讀取其中一個volume數據
data1 = sitk.GetArrayFromImage(ori_data) # 提取數據中心的array
print(dataname_list[3],data1.shape,data1[100,255,255]) #打印數據name、shape和某一個元素的值

plt.imshow(data1[100,:,:]) # 對第100張slice可視化
plt.show()

輸出結果:

['volume-0.nii', 'volume-1.nii', 'volume-10.nii', 'volume-11.nii',... 
volume-11.nii (466, 512, 512) 232.0

表明該數據shape為(466,512,512),注意對應的順序是z,x,y。z其實是slice的索引。x和y是某一個slice的寬和高。

z索引為100的plot結果:

img

同一個slice在ITK-SNAP可視化結果(注意這里(x,y,z=(256,256,101)),因為itk-snap默認從1開始索引):

img

可以發現,上下兩張x軸一樣但y軸方向上下翻轉了,這是由於matplotlib顯示方式不同,但是不會出現讀取數據對不齊的問題。

對於dicom和mhd的處理方式,可以參考這篇博文:

譚慶波:常見醫療掃描圖像處理步驟

2.醫學圖像預處理

這部分內容比較雜亂。因為不同的任務、不同的數據集,通常數據預處理的方法有很大不同。但基本思路是要讓處理后的數據更有利於網絡訓練。那么二維圖像預處理的一些方法都是可以借鑒的,如對比度增強、去噪、裁剪等等。此外還有醫學圖像本身的一些先驗知識也可以利用,比如CT圖像中不同仿射劑量(單位:HU) 會對應人體不同的組織器官。

img

不同放射劑量對應的組織器官

基於上表,可以對原始數據進行歸一化處理:

MIN_BOUND = -1000.0
MAX_BOUND = 400.0

def norm_img(image): # 歸一化像素值到(0,1)之間,且將溢出值取邊界值
    image = (image - MIN_BOUND) / (MAX_BOUND - MIN_BOUND)
    image[image > 1] = 1.
    image[image < 0] = 0.
    return image

也可以將其標准化/0均值化,將數據中心轉移到原點處:

image = image-meam

上述歸一化處理適用於絕大多數數據集,其他一些都是可有可無的針對於具體數據的操作,這些操作包括上面的MIN_BOUND 和MAX_BOUND 都最好參考優秀論文的開源代碼的處理方式。

預處理后的數據集建議保存在本地,這樣可以減少訓練時的部分資源消耗。此外,如隨機裁剪、線性變換等數據增強處理步驟,還是需要在訓練時進行。

此處補充的預處理方式還不是很充分,后續再補充。

參考:

https://zhuanlan.zhihu.com/p/77791840

https://zhuanlan.zhihu.com/p/104381149

譚慶波:常見醫療掃描圖像處理步驟


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM