轉載地址:https://www.cnblogs.com/wzyuan/p/10495946.html
通常我會用simpleitk來讀取dicom文件,主要是爲了將dicom文件轉換爲numpy矩陣,便於輸入神經網絡,讀取dicom文件可分爲兩種情況,一.單獨的dicom文件 二.一系列dicom文件,前者只是一張切片,通常是X光片,後者是很多張切片,合在一起通常代表CT圖像。
一、讀取dicom文件
file = sitk.ReadImage(filepath)
獲取基本信息,大小,像素間距,座標原點,方向
file.GetSize()
file.GetOrigin()
file.GetSpacing()
file.GetDirection()
輸出信息類似下面這樣
還可以獲取很多其它信息,這些信息以字典的形式存儲,稱爲元數據
上面是字典的鍵,具體爲什麼是這種形式,還不太清楚
字典的值形式如下
上面輸出的只是一小部分信息,利用microDicom軟件打開一個dicom文件,可以看到詳細的元信息
當然,最最重要的還是像素矩陣,這是我們用來訓練模型的原料啊
pixel_array = sitk.GetArrayFromImage(file)#這個file是之前讀取出來的文件
二、讀取dicom序列
reader = sitk.ImageSeriesReader()
reader.MetaDataDictionaryArrayUpdateOn()#這一步是加載公開的元信息
reader.LoadPrivateTagsOn()#這一步是加載私有的元信息
series_IDs = sitk.ImageSeriesReader.GetGDCMSeriesIDs(directorypath)#根據文件夾獲取序列ID,一個文件夾裏面通常是一個病人的所有切片,會分爲好幾個序列
dicom_names = reader.GetGDCMSeriesFileNames( directorypath,series_ID)#選取其中一個序列ID,獲得該序列的若干文件名
reader.SetFileNames(dicom_names)#設置文件名
image3D = reader.Execute()#讀取dicom序列
image3D是一個三維矩陣,也就是說是一個三維的立體的數據,可以像讀取一張切片一樣,讀取它的原點,像素間隔,方向,等基本信息
但是元信息的讀取,不能通過image3D本身,要通過reader
reader.GetMetaDataKeys(slice_index)
reader.GetMetaData(slice_index,key)
通過切片的索引來讀取屬於該切片的鍵,然後通過切片索引與鍵獲取相應的值,這裏的鍵值對與單張切片的形式一樣