医学DICOM文件解析(笔记整理)
簡(jiǎn)介:
之前做超聲的時(shí)候第一次接觸帶dicom后綴的圖像文件,于是記錄一下有關(guān)醫(yī)學(xué)影像的學(xué)習(xí)筆記。
DICOM(Digital Imaging and Communications in Medicine)即醫(yī)學(xué)數(shù)字成像和通信,是醫(yī)學(xué)圖像和相關(guān)信息的國(guó)際標(biāo)準(zhǔn)(ISO 12052)。它被廣泛應(yīng)用于放射醫(yī)療,心血管成像以及放射診療診斷設(shè)備(X射線,CT,核磁共振,超聲等),并且在眼科和牙科等其它醫(yī)學(xué)領(lǐng)域得到越來(lái)越深入廣泛的應(yīng)用。
DICOM文件:
醫(yī)學(xué)圖像設(shè)備生成 DICOM 文件,醫(yī)生使用 DICOM 閱讀器來(lái)閱讀并對(duì)圖像中發(fā)現(xiàn)的問(wèn)題進(jìn)行診斷。所有患者的醫(yī)學(xué)圖像都以 DICOM 文件格式進(jìn)行存儲(chǔ)。這個(gè)格式包含關(guān)于患者的 PHI(protected health information)信息,例如姓名,性別,年齡,以及其他圖像相關(guān)信息比如捕獲并生成圖像的設(shè)備信息,醫(yī)療的一些上下文相關(guān)信息等。
這些信息具體可以分為以下四類:(a)Patient(b)Study(c)Series(d)Image。
每一個(gè)DICOM Tag都是由兩個(gè)十六進(jìn)制數(shù)的組合來(lái)確定的,分別為Group和Element。如(0010,0010)這個(gè)Tag表示的是Patient’s Name,它存儲(chǔ)著這張DICOM圖像的患者姓名。
如下圖所示,每個(gè)DICOM文件由一個(gè)DICOM文件頭和一個(gè)DICOM數(shù)據(jù)集合組成:
DICOM前綴——可根據(jù)這長(zhǎng)為4個(gè)字節(jié)的字符串是否等于“DICM”來(lái)判斷該文件是不是DICOM文件。
而DICOM文件的主要組成部分是數(shù)據(jù)集,數(shù)據(jù)元素按照標(biāo)簽tag從小到大順序排列。
最基本的單元是數(shù)據(jù)元,數(shù)據(jù)元主要由4個(gè)部分組成:
1、DICOM TAG: 存儲(chǔ)該項(xiàng)信息的標(biāo)識(shí);
2、VR(value representation) :存儲(chǔ)描述該項(xiàng)信息的數(shù)據(jù)類型;
3、value length : 存儲(chǔ)描述該項(xiàng)信息的數(shù)據(jù)長(zhǎng)度;
4、value: 存儲(chǔ)描述該項(xiàng)信息的數(shù)據(jù)值。
而TAG的分類為:
1、Patient Tag:
2、Study Tag:
3、Series Tag:
4、Image Tag:
Pydicom庫(kù)解析:
目前有基于C++的DCMTK、基于Java的dcm4che和基于python的pydicom,都是非常優(yōu)秀的解釋DICOM標(biāo)準(zhǔn)的第三方庫(kù),下面有Pydicom庫(kù)解析的示例代碼:
#提取單張 dicom 圖像 import pydicom from matplotlib import pyplotds = pydicom.read_file('./001.dcm')# DICOM文件的位置 print(ds.dir()) # 打印所有 DICOM TAG 名 print(ds.dir('Pixe')) # 打印包含 'pat' 的 DICOM TAG print(ds.PatientName, ds.PatientSex, ds.PatientID, ds.PatientBirthDate, ds.PatientAge) # 打印 DICOM TAG 相應(yīng)的屬性值 print(ds.data_element('PatientName')) # 打印一個(gè)完整的數(shù)據(jù)元素,包括 DICOMTAG編碼值(Group, Element), VR, Value print(ds.data_element('PatientID').VR, ds.data_element('PatientID').value) pixel_bytes = ds.PixelData # 原始二進(jìn)制文件pix = ds.pixel_array # 像素值矩陣 print(pix.shape) # 打印矩陣維度 pyplot.imshow(pix, cmap=pylab.cm.bone) pyplot.show() # cmap 表示 colormap,可以是設(shè)置成不同值獲得不同顯示效果,打印dicom圖片 #提取序列 dicom 圖像 import pydicom import numpy from matplotlib import pyplot# 用lstFilesDCM作為存放DICOM files的列表 PathDicom = "D:/dicom_image/V" # 與python文件同一個(gè)目錄下的文件夾 lstFilesDCM = []# 將所有dicom文件讀入 for diName, subdirList, fileList in os.walk(PathDicom):for filename in fileList:if ".dcm" in filename.lower(): # 判斷文件是否為dicom文件print(filename)lstFilesDCM.append(os.path.join(diName, filename)) # 加入到列表中## 將第一張圖片作為參考圖 RefDs = pydicom.read_file(lstFilesDCM[10]) # 讀取第一張dicom圖片 # print(RefDs) # print(RefDs.pixel_array) # print(RefDs.PatientPosition) pyplot.imshow(RefDs.pixel_array, cmap=pyplot.cm.bone) pyplot.show()# 建立三維數(shù)組,分別記錄長(zhǎng)、寬、層數(shù)(也就是dicom數(shù)據(jù)個(gè)數(shù)) ConstPixelDims = (int(RefDs.Rows), int(RefDs.Columns), len(lstFilesDCM)) print(ConstPixelDims)# 得到spacing值 (mm為單位) # PixelSpacing - 每個(gè)像素點(diǎn)實(shí)際的長(zhǎng)度與寬度,單位(mm) # SliceThickness - 每層切片的厚度,單位(mm) ConstPixelSpacing = (float(RefDs.PixelSpacing[0]), float(RefDs.PixelSpacing[1]), float(RefDs.SliceThickness))# 三維數(shù)據(jù) x = numpy.arange(0.0, (ConstPixelDims[0] + 1) * ConstPixelSpacing[0], ConstPixelSpacing[0]) # 0到(第一個(gè)維數(shù)加一*像素間的間隔),步長(zhǎng)為constpixelSpacing y = numpy.arange(0.0, (ConstPixelDims[1] + 1) * ConstPixelSpacing[1], ConstPixelSpacing[1]) # z = numpy.arange(0.0, (ConstPixelDims[2] + 1) * ConstPixelSpacing[2], ConstPixelSpacing[2]) # print(len(x),"xxxx")ArrayDicom = numpy.zeros(ConstPixelDims, dtype=RefDs.pixel_array.dtype)# 遍歷所有的dicom文件,讀取圖像數(shù)據(jù),存放在numpy數(shù)組中 for filenameDCM in lstFilesDCM:ds = pydicom.read_file(filenameDCM)ArrayDicom[:, :, lstFilesDCM.index(filenameDCM)] = ds.pixel_array# 軸狀面顯示 # dpi是指每英寸的像素?cái)?shù),dpi越大,表示打印出來(lái)的圖片越清晰。不是指圖片的大小. # 像素用在顯示領(lǐng)域 分辨率用在打印領(lǐng)域 也就是你的圖像是用來(lái)打印的時(shí)候才去考慮分辨率的問(wèn)題 pyplot.figure(dpi=1000) # 將坐標(biāo)軸都變?yōu)橥乳L(zhǎng)度 # pyplot.axes().set_aspect('equal', 'datalim') pyplot.axes().set_aspect('equal') # 將圖片變?yōu)間ray顏色 pyplot.set_cmap(pyplot.gray())pyplot.imshow(ArrayDicom[:, :, 360])# 第三個(gè)維度表示現(xiàn)在展示的是第幾層 pyplot.show() 56 # 冠狀面顯示 pyplot.figure(dpi=100) pyplot.axes().set_aspect('equal', 'datalim') pyplot.set_cmap(pyplot.gray()) pyplot.imshow(ArrayDicom[:, 90, :]) pyplot.show()總結(jié)
以上是生活随笔為你收集整理的医学DICOM文件解析(笔记整理)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 好用的局域网共享工具
- 下一篇: 2020美赛F奖论文(一):摘要、绪论和