2008-09-23 13 views
17

Was ist die einfachste und meistpythonische Methode zum Parsen einer DICOM-Datei?DICOM-Dateien in nativem Python analysieren

Eine native Python-Implementierung ohne die Verwendung von Nicht-Python-Bibliotheken wäre sehr zu bevorzugen. DICOM ist das Standarddateiformat in der digitalen medizinischen Bildgebung (siehe here für weitere Informationen).

Es gibt einige C/C++ - Bibliotheken, die das Lesen (eine Teilmenge) von DICOM-Dateien unterstützen. Zwei oder drei von ihnen haben sogar Python-Bindungen. Ein nativer Python-Parser würde für mich zwei Zwecke erfüllen:

  1. Keine Notwendigkeit, externe C/C++ - Bibliotheken zu erstellen.
  2. Erfahren Sie mehr über das DICOM-Dateiformat.

Antwort

18

Und ab heute gibt es noch reine Lese DICOM Python Paketdateien zur Verfügung: pydicom

0

Ich frage mich, was das ursprüngliche Plakat versuchte und welche Methoden funktionierten und nicht für ihn arbeiteten. Ich habe noch nie mit DICOM gearbeitet, aber eine schnelle Google-Suche nach "DICOM python" ergab einige interessante Ergebnisse. Es scheint, dass dieses Projekt: http://www.creatis.univ-lyon1.fr/Public/Gdcm/ liefern sollte, was Sie wollen. Es hat Python-Bindungen und eine ziemlich aktive Mailing-Liste.

+0

Ist das eine „Bitte mach meine Hausaufgaben für mich“ Frage? –

+0

Nein, ich habe meine Hausaufgaben gemacht: Es gibt einige C/C++ - Bibliotheken, die das Lesen (eine Teilmenge) von DICOM-Dateien unterstützen. Zwei oder drei von ihnen haben sogar Python-Bindungen. Ein nativer Python-Parser würde für mich zwei Zwecke erfüllen: 1. Keine Notwendigkeit, irgendwelche C/C++ - Bibliotheken zu erstellen. 2. Informieren Sie sich über das DICOM-Dateiformat. –

1

Es gibt einige Bibliotheken sind (meist in C/C++ implementiert) mit Python-Bindungen, zB:

Aber ich bin auf der Suche für eine native Python Implementierung, um mehr über das DICOM-Dateiformat zu erfahren.

+0

beide Links erscheinen faul –

+0

@MonicaHeddneck Danke für die Köpfe hoch; Ich habe gerade beide Links aktualisiert. –

3

Vor einigen Jahren wurde ich war auf der Suche für die gleiche Sache und fanden diese: Python DICOM lib

ich mit dem Code nicht allzu beeindruckt war, aber es stammt Python Lesen von DICOM-Dateien.

9

Wenn Sie über das DICOM-Format erfahren möchten, „Digital Imaging and Communications in Medicine (DICOM): Eine praktische Einführung und Survival Guide "von Oleg Pianykh ist gut lesbar und gibt eine gute Einführung in die wichtigsten DICOM-Konzepte. Springer-Verlag ist der Herausgeber dieses Buches. Der vollständige DICOM-Standard ist natürlich die ultimative Referenz, obwohl er etwas einschüchternder ist. Es ist erhältlich von NEMA().

Das Dateiformat ist eigentlich weniger esoterisch als Sie sich vorstellen können und besteht aus einer Präambel gefolgt von einer Folge von Datenelementen. Die Präambel enthält den ASCII-Text "DICM" und mehrere reservierte Bytes, die nicht verwendet werden. Der Präambel folgt eine Sequenz von Datenelementen. Jedes Datenelement besteht aus der Größe des Elements, einem zweistelligen ASCII-Code, der die Wertdarstellung angibt, einem DICOM-Tag und dem Wert. Datenelemente in der Datei sind nach ihren DICOM-Tag-Nummern sortiert. Das Bild selbst ist nur ein weiteres Datenelement mit einer Größe, Wertdarstellung usw.

Wertdarstellungen geben genau an, wie der Wert zu interpretieren ist. Ist es eine Nummer? Ist es eine Zeichenkette? Wenn es sich um eine Zeichenkette handelt, ist diese kurz oder lang und welche Zeichen sind erlaubt? Der Wertdarstellungscode teilt Ihnen dies mit.

Ein DICOM-Tag ist ein 4-Byte-Hexadezimalcode, der aus einer 2-Byte-Gruppennummer und einer 2-Byte-Elementnummer besteht. Die Gruppennummer ist ein Bezeichner, der angibt, für welche Informationsentität das Tag gilt (z. B. bezieht sich die Gruppe 0010 auf den Patienten und die Gruppe 0020 auf die Studie). Die Elementnummer identifiziert die Interpretation des Wertes (Elemente wie die ID-Nummer des Patienten, die Serienbeschreibung usw.). Um herauszufinden, wie Sie den Wert interpretieren sollten, sucht Ihr Code nach dem DICOM-Tag in einer Wörterbuchdatei.

Es gibt einige andere Details, aber das ist die Essenz davon. Das Informativste, was Sie über das Dateiformat lernen können, ist, eine DICOM-Beispieldatei zu nehmen, sie mit einem Hexeditor zu betrachten und mental zu analysieren. Ich würde davon abraten, etwas über DICOM zu lernen, indem ich zumindest anfangs auf existierende Open-Source-Implementierungen schaue. Es ist wahrscheinlicher zu verwirren, anstatt aufzuklären. Das große Ganze ist wichtiger. Sobald Sie das große Bild haben, können Sie in Feinheiten absteigen.

4

Neuere gdcm Entwicklung jetzt hier geschehen:

http://gdcm.sourceforge.net/

Es unterstützt Java und C# auf der Python.

Warum schreiben noch eine weitere dicom Implementierung, wenn Sie eine einzelne C++ Implementierung zentralisieren können und zugänglich zu so vielen verschiedenen Sprachen

7

Die Bibliothek pydicom oben scheint für den Zugriff auf die DICOM-Datenstrukturen wie eine große Bibliothek erwähnt. Um es zu verwenden, um z.B. RT DOSE Daten, ich denke, man so etwas wie

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)) 

tun würde, und dann, wenn Sie in MayaVi,

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

Diese falsche Koordinaten und Dosis Skalierung gibt, aber das Prinzip sollte gesund sein .

CT Daten sollten sehr ähnlich sein.

17

Ich benutze pydicom schwer in diesen Tagen, und es rockt.

Es ist ziemlich einfach, mit ihm zu spielen beginnen:

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

Um die interessanten Sachen aus diesem „Daten“ Objekt zu erhalten, irgendwie dcmdump Ausgabe ähnelt:

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) 

Ich denke, eine gute Möglichkeit, Um mehr über das dicom-Format zu lernen, müssen Sie ähnliche Dateien öffnen und Code schreiben, um sie nach verschiedenen Aspekten zu vergleichen: Studienbeschreibung, Fensterbreite und -mitte, Pixeldarstellung und so weiter.

Viel Spaß! :)

+2

Ich habe eine Menge Dokumentation gefunden, die besagt "import pydicom". Für mich, mit der Version 0.9.9, war das obige ('import dicom') der korrekte Modulname, obwohl es mit' python -m pip install pydicom' installiert wurde. –

2

DICOM ist ein echter Schmerz ... auch wenn der Hersteller sich an die Standards hält. Wenn Sie Ihre eigene DICOM-Bibliothek schreiben, finden Sie verschiedene Hersteller. DICOMs sind effektiv mit anderen Anbietern inkompatibel [Zitat benötigt].

Ich versuchte (in meiner Freizeit) einen C-Dicom-Parser zu schreiben, der sich stark von einem netten kleinen Ruby-Parser borgte, den ich geschickt "ruby-dicom" nannte.Es ist eigentlich sehr lesbarer Code (ich habe mir eine der kleineren früheren Versionen angeschaut).

Das größte Problem war der Versuch, eine Bibliothek der Header-Tags mit den erwarteten Datentypen zu erstellen. Es gibt die standarddefinierten Tags und die Vendor-Tags. Die Ruby-Dicom-Dateien enthalten eine Bibliothek von Tags in einem Textformat, das leicht überprüft werden kann.

Ich gab die offizielle Literatur auf, da ich nur an dem Dateiformat interessiert war, das nur in einem der 10 oder so großen PDFs zu finden ist.

Meine lokalen DICOM-Dateien sind nicht komprimiert und folgen üblichen, einfach zu programmierenden Bit-Anordnungen, sind aber auf verschiedene Komprimierungen und seltsame 12-Bit-Bilder in 8-Bit-Containern mit großer oder kleiner Endianz und ohne Füllbits vorbereitet.

Ich habe aufgegeben, sobald die Zeit sehr knapp wurde.

Python ist wahrscheinlich eine viel bessere Wahl als C für diese Art von Kopf Parsing obwohl ...