醫學圖像之DICOM格式解析

最近導師給安排了新任務,因爲剛進入實驗室,對於醫學圖像這一塊還只知其一;不知其二,因此就想分享一下有關醫學常見影像的學習(尤爲是dicom後綴的圖像文件),歡迎你們一塊兒交流。html

目錄python

1.醫學影像學的介紹git

2.DICOM信息的簡介github

3.DICOM內部信息詳解(DICOM Tag與VR)數組

4.利用python+pydicom這個庫解析DICOM文件app

5.DICOM的三個切面wordpress


 

1.醫學影像學學習

(1).醫學影像學Medical Imaging,是研究藉助於某種介質(如X射線、電磁場、超聲波等)與人體相互做用,把人體內部組織器官結構、密度以影像方式表現出來,供診斷醫師根據影像提供的信息進行判斷,從而對人體健康情況進行評價的一門科學,包括醫學成像系統和醫學圖像處理兩方面相對獨立的研究方向。編碼

(2).儀器主要包括X光成像儀器、CT(普通CT、螺旋CT)、正子掃描(PET)、超聲(分B超、彩色多普勒超聲、心臟彩超、三維彩超)、核磁共振成像(MRI)、心電圖儀器、腦電圖儀器等url

2.DICOM簡介

(1)DICOM(Digital Imaging and Communications in Medicine)即醫學數字成像和通訊,是醫學圖像和相關信息的國際標準(ISO 12052)。DICOM被普遍應用於放射醫療,心血管成像以及放射診療診斷設備(X射線,CT,核磁共振,超聲等),而且在眼科和牙科等其它醫學領域獲得愈來愈深刻普遍的應用。全部患者的醫學圖像都以 DICOM 文件格式進行存儲。這個格式包含關於患者的 PHI(protected health information,https://en.wikipedia.org/wiki/Protected_health_information)信息,例如姓名,性別,年齡,以及其餘圖像相關信息好比捕獲並生成圖像的設備信息,醫療的一些上下文相關信息等。醫學圖像設備生成 DICOM 文件,醫生使用 DICOM 閱讀器(可以顯示 DICOM 圖像的計算機軟件)閱讀並對圖像中發現的問題進行診斷

(2)目前採用的標準是DICOM3.0,每一張圖像中都攜帶着大量的信息,這些信息具體能夠分爲如下四類:a)Patient(b)Study(c)Series(d)Image每個DICOM Tag都是由兩個十六進制數的組合來肯定的,分別爲Group和Element。如(0010,0010)這個Tag表示的是Patient’s Name,它存儲着這張DICOM圖像的患者姓名。

(3)基於C++的DCMTK、基於Java的dcm4che以及基於python的pydicom,都是很是優秀的解釋DICOM標準的第三方庫,經過在工程中引入它們能夠避免軟件開發人員去進行底層的解析工做,可爲項目開發提升效率。下文將會利用基於python的pydicom解析一下dicom文件。

(4)目前例如CT,核磁共振,超聲等利用精確準直的X線束、γ射線、超聲波等,與靈敏度極高的探測器一同圍繞人體的某一部位做一個接一個的斷面掃描,因此掃描後獲得的圖像是多層的圖像,而咱們把一層層的圖像在z軸上堆疊起來就能夠造成三維圖像(這就涉及到三維重建的問題),這時,每一層的圖像咱們均可以存在dicom文件中(固然,dicom文件不是單純的像素信息,它還有不少的數據頭部信息),以下圖,咱們的目的就是要把在這些數據頭部信息和像素信息從一系列dicom文件中讀取出來。

 

(5) DICOM文件是指按照DICOM標準而存儲的醫學文件,通常由一個DICOM文件頭和一個DICOM數據集合組成,結構圖以下圖

DICOM文件頭包含了標識數據集合的相關信息,每一個DICOM文件都必須包括一個文件頭:

  • 文件導言,由128個字節組成。
  • DICOM前綴,可根據這長爲4個字節的字符串是否等於「DICM」來判斷該文件是否是DICOM文件。
  • 文件信息元素

有關DICOM文件中的數據集部份內容在下一個知識點。

3.DICOM內部信息詳解(DICOM Tag與VR)

(1)DICOM文件的主要組成部分是數據集,它是由DICOM數據元素按照指定的順序依次排列組成的。對於DICOM文件,通常採用顯式傳輸,數據元素按照標籤Tag從小到大順序排列。最基本的單元是數據元,數據元主要由4個部分組成:

  • DICOM TAG: 存儲該項信息的標識
  • VR(value representation) :存儲描述該項信息的數據類型。
  • value length : 存儲描述該項信息的數據長度
  • value: 存儲描述該項信息的數據值

(2)DICOM TAG的分類與說明,在上一個內容中說過,DICOM TAG具體可分爲4大類。

  • Patient Tag 
  • Study Tag

  • Series Tag

  • Image Tag

(3)VR是DICOM標準中用來描述數據類型的,總共有27個值。簡單分類以下

 

 4.利用python+pydicom這個庫解析DICOM文件

1.1首先導入解析DICOM文件所需的庫

1 import pydicom 2 import pylab

1.2加載DICOM文件

1 ds = dicom.read_file('D:/dicom_image/V/P01-0000.dcm')# 在你機器上DICOM文件的位置

1.3相關屬性的打印

 1 print(ds.dir()) # 打印全部 DICOM TAG 名
 2 print(ds.dir('pat')) # 打印包含 'pat' 的 DICOM TAG
 3 print(ds.PatientName, ds.PatientSex, ds.PatientSize, ds.PatientWeight ) # 打印 DICOM TAG 相應的屬性值
 4 print(ds.data_element('PatientID')) # 打印一個完整的數據元素,包括 DICOMTAG編碼值(Group, Element), VR, Value
 5 print(ds.data_element('PatientID').VR, ds.data_element('PatientID').value)
6 pixel_bytes = ds.PixelData # 原始二進制文件 7 pix = ds.pixel_array # 像素值矩陣 8 print(pix.shape) # 打印矩陣維度 9 pylab.imshow(pix, cmap=pylab.cm.bone) 10 pylab.show() # cmap 表示 colormap,能夠是設置成不一樣值得到不一樣顯示效果,打印dicom圖片

2.以上只是針對一張DICOM圖片進行解析,接下倆讓我看看將一系列的dicom文件讀入的效果。

首先導入相應所須要的包

1 import os 2 import pydicom 3 import numpy 4 from matplotlib import pyplot

其次就是解析代碼

 

 1 # 用lstFilesDCM做爲存放DICOM files的列表
 2 PathDicom = "D:/dicom_image/V"  # 與python文件同一個目錄下的文件夾
 3 lstFilesDCM = []  4 
 5 # 將全部dicom文件讀入
 6 for diName, subdirList, fileList in os.walk(PathDicom):  7     for filename in fileList:  8         if ".dcm" in filename.lower():  # 判斷文件是否爲dicom文件
 9             print(filename) 10             lstFilesDCM.append(os.path.join(diName, filename))  # 加入到列表中
11 
12 ## 將第一張圖片做爲參考圖
13 RefDs = pydicom.read_file(lstFilesDCM[10])  # 讀取第一張dicom圖片
14 # print(RefDs)
15 # print(RefDs.pixel_array)
16 # print(RefDs.PatientPosition)
17 pyplot.imshow(RefDs.pixel_array, cmap=pyplot.cm.bone) 18 pyplot.show() 19 
20 # 創建三維數組,分別記錄長、寬、層數(也就是dicom數據個數)
21 ConstPixelDims = (int(RefDs.Rows), int(RefDs.Columns), len(lstFilesDCM)) 22 print(ConstPixelDims) 23 
24 # 獲得spacing值 (mm爲單位)
25 # PixelSpacing - 每一個像素點實際的長度與寬度,單位(mm)
26 # SliceThickness - 每層切片的厚度,單位(mm)
27 ConstPixelSpacing = (float(RefDs.PixelSpacing[0]), float(RefDs.PixelSpacing[1]), float(RefDs.SliceThickness)) 28 
29 # 三維數據
30 x = numpy.arange(0.0, (ConstPixelDims[0] + 1) * ConstPixelSpacing[0], ConstPixelSpacing[0])  # 0到(第一個維數加一*像素間的間隔),步長爲constpixelSpacing
31 y = numpy.arange(0.0, (ConstPixelDims[1] + 1) * ConstPixelSpacing[1], ConstPixelSpacing[1])  # 32 z = numpy.arange(0.0, (ConstPixelDims[2] + 1) * ConstPixelSpacing[2], ConstPixelSpacing[2])  # 33 print(len(x),"xxxx") 34 
35 ArrayDicom = numpy.zeros(ConstPixelDims, dtype=RefDs.pixel_array.dtype) 36 
37 # 遍歷全部的dicom文件,讀取圖像數據,存放在numpy數組中
38 for filenameDCM in lstFilesDCM: 39     ds = pydicom.read_file(filenameDCM) 40     ArrayDicom[:, :, lstFilesDCM.index(filenameDCM)] = ds.pixel_array 41 
42 
43 # 軸狀面顯示
44 # dpi是指每英寸的像素數,dpi越大,表示打印出來的圖片越清晰。不是指圖片的大小.
45 # 像素用在顯示領域 分辨率用在打印領域 也就是你的圖像是用來打印的時候纔去考慮分辨率的問題
46 pyplot.figure(dpi=1000) 47 # 將座標軸都變爲同等長度
48 # pyplot.axes().set_aspect('equal', 'datalim')
49 pyplot.axes().set_aspect('equal') 50 # 將圖片變爲gray顏色
51 pyplot.set_cmap(pyplot.gray()) 52 
53 pyplot.imshow(ArrayDicom[:, :, 360])# 第三個維度表示如今展現的是第幾層 
54 pyplot.show()
55
56 # 冠狀面顯示
57 pyplot.figure(dpi=100)
58 pyplot.axes().set_aspect('equal', 'datalim')
59 pyplot.set_cmap(pyplot.gray())
60 pyplot.imshow(ArrayDicom[:, 90, :])
61 pyplot.show()

 

結果以下:

軸狀面:

冠狀面:

 更多相關內容能夠查看pydicom文檔官網

5.DICOM的三個切面

以下圖所示:是一個三維矩陣的模型,黃線一面區域是橫斷位面,藍線一面區域是冠狀面,紅線一面區域是矢狀面:

 

 

參考:https://pyscience.wordpress.com/2014/09/08/dicom-in-python-importing-medical-image-data-into-numpy-with-pydicom-and-vtk/


以上爲本次學習內容,歡迎交流

相關文章
相關標籤/搜索