最近在整理與回顧剛加入實驗室所學的相關知識,那會主要是對DICOM這個醫療圖像進行相應的研究,之前有一篇博客已經講述了一些有關DICOM的基本知識,今天這篇博客就讓我們了解一下如何將Dicom文件轉為mhd,raw文件格式。
一、將Dicom文件轉mhd,raw文件格式的原因
醫學圖像通常是通過dicom文件格式進行存儲的,但為了便於讀取和使用也常常將其轉化為:每個病人一個mhd文件和一個同名的raw文件的格式,mhd即meta header data,數據頭部信息,raw存儲了像素信息。如下圖所示:
二、利用python+SimpleITK完成上述過程的轉換
其中mhd文件存儲了dicom的頭部信息,由於頭部信息很多生成mhd的方法有所不同,所以這里展示了通過ITK(ITK是美國國家衛生院下屬的國立醫學圖書館開發的一款醫學圖像處理軟件包,是一個開源的、跨平台的影像分析擴展軟件工具。)產生mhd文件的文件內容(利用寫字板打開),有以下頭部信息:
以下為實現的代碼,附着詳細的代碼注釋:
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"))
以上就是本次學習的內容,歡迎大家交流與討論。