Python讀取預處理DICOM文件方式詳解
需要的庫
●Simpleitk
安裝命令:
conda install -c simpleitk simpleitk
使用:
import SimpleITK as sitk
●pydicom(不推薦,可能有些文件打不開)
安裝命令:
conda install -c conda-forge pydicom
●PIL
使用:
from PIL import Image
讀取dicom
讀取Series信息
由于患者可以同時做多個檢查,所以dicom中可以包含多個study(多次檢查,一般只有一個檢查,所以不用管這個)和series(多個部位,一些信息也是用不同series保存),所以第一步就是要讀取series信息。
代碼:
reader = sitk.ImageSeriesReader() ids = reader.GetGDCMSeriesIDs(dict_name)
ids里包含了所有series的id,dict_name為dicom文件所在目錄路徑
讀取Series中所有圖片
利用上面讀取的series的id可以分開讀取不同series。
代碼:
for i in ids: series_file_name = reader.GetGDCMSeriesFileNames(dict_name, i)
series_file_name中包含某個series所有圖片的路徑,一般我們只需要圖片數(shù)量最多的那個series。ids為series的id列表,dict_name為dicom文件所在目錄路徑。
(重點)讀取meta data(元數(shù)據(jù))
dicom文件包含大量的元數(shù)據(jù),會指出與該次檢查的相關信息,常用的有 Slice thickness(層厚), Pixel spacing(像素間距)可以根據(jù)需要讀取相應的元數(shù)據(jù)。
代碼:
file_reader = sitk.ImageFileReader() file_reader.SetFileName(series_file_name[0]) file_reader.ReadImageInformation() study_id = file_reader.GetMetaData("0008|1030") series_file_name[0]
可以為任意dicom文件的路徑,“0008|1030"為元數(shù)據(jù)的tags,詳細的可以參考http://www.yuantk.com/toolkit_40.html ,或者直接搜索"dicom tag”
轉換為圖片并保存
代碼:
image = sitk.ReadImage(series_file_name[0]) image_data = sitk.GetArrayFromImage(image)[0] image_data = normalization(image_data) Image.fromarray(image_data).convert("RGB").save(image_save_path)
series_file_name[0]可以為任意dicom文件的路徑,使用simpleitk讀取的數(shù)據(jù)已經(jīng)進利用斜率和截距進行了線性變換無需二次處理。image_save_path為保存的路徑,注意路徑要包含文件名(例:‘./1.png’),這里的要重點關注normalization函數(shù),該函數(shù)涉及窗口技術。
(重點)窗口技術
由于dicom存儲的是CT值矩陣,由于各種組織結構或病變具有不同的CT值,因此欲顯示某一組織結構細節(jié)時,應選擇適合觀察該組織或病變的窗寬和窗位,以獲得最佳顯示,這里需要利用窗口技術進行轉換。窗口技術涉及兩個關鍵參數(shù),窗位與窗寬。
窗寬(WW):是CT圖像上顯示的CT值范圍,在此CT值范圍內的組織和病變均以不同的灰度顯示,而CT值高于此范圍的組織和病變,均以白影顯示,不再有灰度差異;反之,低于此范圍的組織結構,均以黑影顯示,也無灰度差別。
窗位(WL):是窗的中心位置。
公式:
WW=CTmax-CTmin WL=(CTmax+CTmin)/2 CTmax = WW/2+WL CTmin = WL-WW/2
轉換后的圖片灰度值=(CT值-CTmin) / (CTmax - CTmin) * 255
代碼:
def normalization(data, window_level=-600., window_width=2000.): high = window_level + window_width / 2 low = window_level - window_width / 2 data = (data - low) / window_width * 255 data[data > 255] = 255 data[data < 0] = 0 return data
window_level和window_width根據(jù)實際需要設定,data為simpleitk讀取的數(shù)據(jù)
到此這篇關于Python讀取預處理DICOM文件方式的文章就介紹到這了,更多相關Python讀取DICOM文件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python如何將多個模型的ROC曲線繪制在一張圖(含圖例)
這篇文章主要給大家介紹了關于python如何將多個模型的ROC曲線繪制在一張圖的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2022-02-02解決python中導入win32com.client出錯的問題
今天小編就為大家分享一篇解決python中導入win32com.client出錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07Pytorch distributed 多卡并行載入模型操作
這篇文章主要介紹了Pytorch distributed 多卡并行載入模型操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06