Frage

Was ist die einfachste und am meisten pythonic Weg, um eine DICOM-Datei zu analysieren?

Eine native Python-Implementierung ohne die Verwendung von nicht-Python-Bibliotheken würde viel lieber sein. DICOM ist das Standard-Dateiformat in der digitalen medizinischen Bildgebung (sehen hier für weitere Informationen).

Es gibt einige C / C ++ Bibliotheken, die (eine Untergruppe) von DICOM-Dateien unterstützen zu lesen. Zwei oder drei von ihnen sogar Python-Bindungen haben. Ein native Python-Parser zwei Zwecke für mich dienen würde:

  1. Sie müssen keine externen C / C ++ Bibliotheken zu bauen.
  2. Erfahren Sie mehr über das DICOM-Dateiformat.
War es hilfreich?

Lösung

Und ab heute gibt es eine andere reine DICOM-Paket Lese Python-Dateien zur Verfügung: pydicom

Andere Tipps

Ich bin mit pydicom stark 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 raus aus diesem "Daten" Objekt, irgendwie ähnelt dcmdump Ausgabe:

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, ein guter Weg, um mehr über das DICOM-Format zu lernen ist, ähnliche Dateien zu öffnen und den Code zu schreiben, sie vergleichen nach verschiedenen Aspekten:. Studienbeschreibung, Fensterbreite und in der Mitte, Pixeldarstellung und so weiter

Viel Spaß! :)

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 Schlüssel-DICOM-Konzepte. Springer-Verlag ist der Herausgeber dieses Buches. Der vollständige DICOM-Standard ist, natürlich, die ultimative Referenz obwohl es etwas einschüchternd ist. Es ist erhältlich bei NEMA ( http://medical.nema.org ).

Das Dateiformat ist eigentlich weniger esoterisch als man sich vorstellen und besteht aus einer Präambel durch eine Folge von Datenelementen gefolgt könnte. Die Präambel enthält den ASCII-Text „DICM“ und mehrere reservierten Bytes, die nicht verwendet werden. Nach der Präambel besteht aus einer Folge von Datenelementen. Jedes Datenelement besteht aus der Größe des Elements, ein Zwei-Zeichen-ASCII-Code, die angibt, den Wert Darstellung eines DICOM-Tags und den Wertes. Die Datenelemente in der Datei werden von ihren DICOM-Tag-Nummern bestellt. Das Bild selbst ist nur ein weiteres Datenelement mit einer Größe, Wertdarstellung etc.

Wertdarstellungen genau festlegen, wie der Wert zu interpretieren. Ist es eine Zahl? Ist es eine Zeichenkette? Wenn es sich um eine Zeichenfolge ist, ist es ein kurzer oder ein langer und die Zeichen sind erlaubt? Die Wertdarstellung Code sagt Ihnen diese.

A DICOM-Tag ist ein 4-Byte Hexadezimal-Code, bestehend aus einer 2-Byte "Gruppe" Nummer und eine 2-Byte "Element" Nummer. Die Gruppennummer eine Kennung ist, die Sie sagt, welche Informationen Entität des Tag gilt (zB Gruppe 0010 bezieht sich auf den Patienten und Gruppe 0020 bezieht sich auf die Studie). Die Elementnummer identifiziert die Interpretation des Wertes (Elemente wie der ID-Nummer des Patienten, die Reihe Beschreibung, etc.). Um herauszufinden, wie Sie den Wert interpretieren sollen Ihr Code sieht den DICOM-Tag in einer Wörterbuchdatei auf.

Es gibt einige andere Details beteiligt, aber das ist die Essenz davon. Das wohl instruktiv, was Sie tun können, um das Dateiformat zu lernen, ist ein Beispiel DICOM-Datei zu nehmen, schauen Sie es mit einem Hex-Editor, und gehen Sie durch den Prozess es geistig zu parsen. Ich würde davon abraten, versucht, über DICOM zu lernen, indem sie bei bestehenden Open-Source-Implementierungen suchen, zumindest am Anfang. Es ist eher zu verwirren statt aufzuklären. das große Bild zu bekommen ist wichtiger. Sobald Sie das große Bild haben, dann können Sie in Feinheiten absteigen.

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

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

und dann, wenn Sie in MayaVi,

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

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

CT-Daten sollten sehr ähnlich sein.

Neuere gdcm Entwicklung jetzt passiert hier:

http://gdcm.sourceforge.net/

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

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

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

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

DICOM ist eine echte Schmerzen ... auch wenn die Hersteller hält sich an die Standards. Wenn Sie Ihre eigene DICOM-Bibliothek schreiben werden Sie verschiedene Hersteller finden DICOMs mit anderen Anbietern wirksam unvereinbar sind [Bearbeiten].

Ich habe versucht (in meiner Freizeit) ein C dicom Parser schreibt stark von einem netten kleinen Ruby-Parser borgen stieß ich auf listig namens ‚

Es gibt einige Bibliotheken (am häufigsten implementiert in C / C ++) mit Python-Bindungen, z.

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

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top