最近在整理與回顧剛加入實驗室所學的相關知識,那會主要是對DICOM這個醫療圖像進行相應的研究,以前有一篇博客已經講述了一些有關DICOM的基本知識,今天這篇博客就讓咱們瞭解一下如何將Dicom文件轉爲mhd,raw文件格式。python
1、將Dicom文件轉mhd,raw文件格式的緣由數組
醫學圖像一般是經過dicom文件格式進行存儲的,但爲了便於讀取和使用也經常將其轉化爲:每一個病人一個mhd文件和一個同名的raw文件的格式,mhd即meta header data,數據頭部信息,raw存儲了像素信息。以下圖所示:app
2、利用python+SimpleITK完成上述過程的轉換工具
其中mhd文件存儲了dicom的頭部信息,因爲頭部信息不少生成mhd的方法有所不一樣,因此這裏展現了經過ITK(ITK是美國國家衛生院下屬的國立醫學圖書館開發的一款醫學圖像處理軟件包,是一個開源的、跨平臺的影像分析擴展軟件工具。)產生mhd文件的文件內容(利用寫字板打開),有如下頭部信息:學習
如下爲實現的代碼,附着詳細的代碼註釋:spa
1 import cv2 2 import os 3 import pydicom 4 import numpy 5 import SimpleITK 6 7 # 路徑和列表聲明 8 # 與python文件同一個目錄下的文件夾,存儲dicom文件,該文件路徑最好不要含有中文 9 PathDicom = "D:/dicom_image/V" 10 # 與python文件同一個目錄下的文件夾,用來存儲mhd文件和raw文件,該文件路徑最好不要含有中文 11 SaveRawDicom = "D:/dicom_image/V/SaveRaw" 12 lstFilesDCM = [] 13 14 # 將PathDicom文件夾下的dicom文件地址讀取到lstFilesDCM中 15 for dirName, subdirList, fileList in os.walk(PathDicom): 16 for filename in fileList: 17 if ".dcm" in filename.lower(): # 判斷文件是否爲dicom文件 18 print(filename) 19 lstFilesDCM.append(os.path.join(dirName, filename)) # 加入到列表中 20 21 # 第一步:將第一張圖片做爲參考圖片,並認爲全部圖片具備相同維度 22 RefDs = pydicom.read_file(lstFilesDCM[0]) # 讀取第一張dicom圖片 23 24 # 第二步:獲得dicom圖片所組成3D圖片的維度 25 ConstPixelDims = (int(RefDs.Rows), int(RefDs.Columns), len(lstFilesDCM)) # ConstPixelDims是一個元組 26 27 # 第三步:獲得x方向和y方向的Spacing並獲得z方向的層厚 28 ConstPixelSpacing = (float(RefDs.PixelSpacing[0]), float(RefDs.PixelSpacing[1]), float(RefDs.SliceThickness)) 29 30 # 第四步:獲得圖像的原點 31 Origin = RefDs.ImagePositionPatient 32 33 # 根據維度建立一個numpy的三維數組,並將元素類型設爲:pixel_array.dtype 34 ArrayDicom = numpy.zeros(ConstPixelDims, dtype=RefDs.pixel_array.dtype) # array is a numpy array 35 36 # 第五步:遍歷全部的dicom文件,讀取圖像數據,存放在numpy數組中 37 i = 0 38 for filenameDCM in lstFilesDCM: 39 ds = pydicom.read_file(filenameDCM) 40 ArrayDicom[:, :, lstFilesDCM.index(filenameDCM)] = ds.pixel_array 41 cv2.imwrite("out_" + str(i) + ".png", ArrayDicom[:, :, lstFilesDCM.index(filenameDCM)]) 42 i += 1 43 44 # 第六步:對numpy數組進行轉置,即把座標軸(x,y,z)變換爲(z,y,x),這樣是dicom存儲文件的格式,即第一個維度爲z軸便於圖片堆疊 45 ArrayDicom = numpy.transpose(ArrayDicom, (2, 0, 1)) 46 47 # 第七步:將如今的numpy數組經過SimpleITK轉化爲mhd和raw文件 48 sitk_img = SimpleITK.GetImageFromArray(ArrayDicom, isVector=False) 49 sitk_img.SetSpacing(ConstPixelSpacing) 50 sitk_img.SetOrigin(Origin) 51 SimpleITK.WriteImage(sitk_img, os.path.join(SaveRawDicom, "sample" + ".mhd"))
以上就是本次學習的內容,歡迎你們交流與討論。code