2008-09-23 145 views
17

什麼是解析DICOM文件的最簡單和最Python的方式?了本機Python解析DICOM文件

不使用非Python庫的原生Python實現會更喜歡。 DICOM是數字醫學成像中的標準文件格式(有關更多信息,請參閱here)。

存在支持的DICOM文件中讀取(子集)的一些C/C++庫。其中兩三個甚至有Python綁定。一個本地的Python解析器將爲我提供兩個目的:

  1. 無需構建任何外部C/C++庫。
  2. 瞭解DICOM文件格式。

回答

18

而作爲今天的還有另一個可用的純Python包閱讀DICOM文件:pydicom

0

我不知道樓主嘗試和方法的工作,而不是爲他工作。我從來沒有與DICOM合作過,但是對「DICOM python」的快速搜索給出了一些有趣的結果。看來這個項目:http://www.creatis.univ-lyon1.fr/Public/Gdcm/應該提供你想要的。它有python綁定和一個相當活躍的郵件列表。

+0

這是一個問題,「請爲我做我的功課」? – 2008-09-23 10:00:16

+0

不,恕我直言,我做了我的功課:有一些C/C++庫支持DICOM文件的閱讀(一個子集)。其中兩三個甚至有Python綁定。 本地Python解析器對我來說有兩個目的: 1.無需構建任何C/C++庫。 2.瞭解DICOM文件格式。 – 2008-09-23 12:38:01

1

沒有與Python綁定一些庫(通常在C/C++實現的),例如:

不過,我正在尋找一個原生的Python執行以瞭解更多關於DICOM文件格式。

+0

這兩個鏈接都顯得爛爛 – 2018-01-26 20:57:47

3

幾年前,我一直在尋找同樣的東西,發現這個: Python DICOM lib

我沒有與代碼太深刻的印象,但它是原生的Python讀物DICOM文件。

9

如果您想了解DICOM格式,「數字成像和通信醫學(DICOM):實用簡介及生存指南「作者Oleg Pianykh非常具有可讀性,可以很好地介紹DICOM的關鍵概念。 Springer-Verlag是本書的出版商。當然,完整的DICOM標準是最終的參考標準,儘管它更具威脅性。它可從NEMA獲得(http://medical.nema.org)。

文件格式實際上比你想象的少深奧和由序言,隨後的數據元素的序列中。前導碼包含ASCII文本「DICM」和幾個未使用的保留字節。序言之後是一系列數據元素。每個數據元素由元素的大小,表示值表示的雙字符ASCII碼,DICOM標記和值組成。文件中的數據元素按其DICOM標籤號排序。圖像本身只是一個大小,數值表示等

值表示指定究竟如何解釋值的另一個數據元素。這是一個數字嗎?它是一個字符串嗎?如果是字符串,是短的還是長的,哪些字符是允許的?值表示代碼告訴你這一點。

DICOM標籤是一個4字節的十六進制代碼,由2個字節的「組」數字和2個字節的「元素」數字組成。組號是一個標識符,告訴您標籤適用於什麼信息實體(例如,組0010指的是患者,組0020指的是研究)。元素編號標識值的解釋(諸如患者的ID號,系列描述等項目)。要了解如何解釋該值,代碼將在字典文件中查找DICOM標籤。

還有一些其他的細節,但這是它的本質。學習文件格式可能最有教育意義的事情是拿一個DICOM文件的例子,用一個十六進制編輯器來查看它,然後通過精神解析它的過程。我建議不要嘗試通過查看現有的開源實現來了解DICOM,至少在最初階段。它更容易混淆而不是開導。獲得大局面更重要。一旦你有了大局,那麼你可以下降到微妙的地步。

4

較新的gdcm發展到現在發生在這裏:

http://gdcm.sourceforge.net/

它支持在Python之上的Java和C#。

爲什麼寫又一 DICOM實現時,你可以集中一個C++實現,也有它接觸到這麼多不同的語言

7

上面提到的似乎是用於訪問DICOM數據結構一個偉大的圖書館圖書館pydicom。要使用它來訪問例如RT劑量數據,我想一個會做類似

import dicom,numpy 
dose = dicom.ReadFile("RTDOSE.dcm") 
d = numpy.fromstring(dose.PixelData,dtype=numpy.int16) 
d = d.reshape((dose.NumberofFrames,dose.Columns,dose.Rows)) 

,然後,如果你在Mayavi的是,

from enthought.mayavi import mlab 
mlab.pipeline.scalar_field(d) 

這給了錯誤的座標和劑量縮放,但原則應該是聲音。

CT數據應該非常相似。

17

這幾天我大量使用pydicom,並且它很有趣。

這是很容易開始擺弄它:

import dicom 
data = dicom.read_file("yourdicomfile.dcm") 

要獲得有趣的東西出來說,「數據」的對象,在某種程度上類似於dcmdump輸出:

for key in data.dir():   
    value = getattr(data, key, '') 
    if type(value) is dicom.UID.UID or key == "PixelData": 
     continue 

    print "%s: %s" % (key, value) 

我認爲一個偉大的方式瞭解更多關於dicom格式的信息是打開相似的文件並根據各個方面編寫代碼來進行比較:研究描述,窗口寬度和中心,像素表示等等。

玩得開心! :)

2

DICOM是一個真正的痛苦......即使製造商堅持標準。如果您編寫自己的DICOM庫,您會發現不同的製造商DICOM與其他供應商實際上不兼容[需要的引證]。

我嘗試了(在我的空閒時間)編寫一個C語言的dicom解析器,借用了一個很好的Ruby解析器,我狡猾地稱爲'ruby-dicom'。它實際上是非常易讀的代碼(我查看了一個較小的早期版本)。

最大的問題是試圖用預期的數據類型來堆積標題標籤庫。有標準定義的標籤和供應商標籤。 ruby-dicom文件包含一個文本格式的標籤庫,可以很容易地進行檢查。

我放棄了官方文獻,因爲我只對文件格式感興趣,似乎只是在10個左右的PDF文件中的一個。

我的本地DICOM文件沒有壓縮,並遵循標準的易於編碼的位排列,但是準備好用於存儲在8位容器中的各種壓縮和奇怪的12位圖像,並且有大或小的字節順序和沒有填充位。

一旦時間變得非常稀少,我放棄了。

Python是可能比下這種風格的標題解析雖然一個更好的選擇......