2017-10-10 2 views
7

Also, wenn ich ein Bild haben (CT, MRI, etc.) oder sogar eine Dosis von Strahlentherapie kann ich die Dosis oder Bildwerte in einem Array durch herausziehen:Erste DICOM Strukturlinien als Array in Python

import dicom 

ds = dicom.read_file("dicom_file.dcm") 

print ds.pixel_array 

Das ist ziemlich einfach und gibt mir die Möglichkeit, Bilder/Dosen zu manipulieren, wie ich will. Oft haben Sie jedoch auch eine Strukturdatei, die verschiedene konturierte Strukturen enthält, die Sie dann in einem Bildbetrachter oder ähnlichem sehen können. Nochmals, ziemlich einfach.

Mein Problem ist, dass ich diese einzelnen Strukturen auch gerne als Array hätte. Und wenn ich den gleichen Code laufe bekomme ich nur TypeError: No pixel data found in this dataset.

Ich vermute, dass Struktur DICOM-Dateien nicht auf die gleiche Weise wie Dosis/Bilder DICOM-Dateien "gemacht" werden.

Also gibt es eine Lösung, die ich nicht finden konnte? Ich habe mir auch das Paket dicompyler_core angeschaut, aber von dem, was ich dort sehen konnte, gab es keine Möglichkeit, "die verschiedenen Strukturen in Arrays" zu "bringen". Hier

+1

Bitte geben Sie die SOP-Klassen-UID der betreffenden DICOM-Datei an, damit wir wissen, wie die Informationen codiert sind. –

+0

@kritzel_sw Oh, tut mir leid für die langsame Antwort. Wenn ich den Tag "SOP Class UID" in meiner Strukturdatei verwende, bekomme ich: RT Structure Set Storage. Weißt du nicht, ob du das verlangst? –

Antwort

2

ist eine interaktive Sitzung mit dem Datenlayout unter Verwendung der Datei mit rtstruct.dcm pydicom Veranschaulichung eingeschlossen:

>>> import dicom 
>>> ds = dicom.read_file("rtstruct.dcm", force=True) 
>>> ds.dir("contour") 
['ROIContourSequence'] 
>>> ctrs = ds.ROIContourSequence 
>>> ctrs[0] 
(3006, 002a) ROI Display Color     IS: ['220', '160', '120'] 
(3006, 0040) Contour Sequence 3 item(s) ---- 
    (3006, 0042) Contour Geometric Type    CS: 'CLOSED_PLANAR' 
    (3006, 0046) Number of Contour Points   IS: '5' 
    (3006, 0048) Contour Number      IS: '1' 
    (3006, 0050) Contour Data      DS: ['-200.0', '150.0', '-20 
0.0', '-200.0', '-150.0', '-200.0', '200.0', '-150.0', '-200.0', '200.0', '150.0 
', '-200.0', '-200.0', '150.0', '-200.0'] 
    --------- 
    (3006, 0042) Contour Geometric Type    CS: 'CLOSED_PLANAR' 
    (3006, 0046) Number of Contour Points   IS: '6' 
    (3006, 0048) Contour Number      IS: '2' 
    (3006, 0050) Contour Data      DS: ['200.0', '-0.0', '-190. 
0', '200.0', '-150.0', '-190.0', '-200.0', '-150.0', '-190.0', '-200.0', '150.0' 
, '-190.0', '200.0', '150.0', '-190.0', '200.0', '-0.0', '-190.0'] 
    --------- 
    (3006, 0042) Contour Geometric Type    CS: 'CLOSED_PLANAR' 
    (3006, 0046) Number of Contour Points   IS: '6' 
    (3006, 0048) Contour Number      IS: '3' 
    (3006, 0050) Contour Data      DS: ['200.0', '-0.0', '-180. 
0', '200.0', '-150.0', '-180.0', '-200.0', '-150.0', '-180.0', '-200.0', '150.0' 
, '-180.0', '200.0', '150.0', '-180.0', '200.0', '-0.0', '-180.0'] 
    --------- 
(3006, 0084) Referenced ROI Number    IS: '1' 

die Daten gespeichert sind (in diesem Fall, wie es üblich ist) als ein Satz von Koordinaten für jeden Ebene. Um die Daten für eine Kontur zu erhalten, für eine Ebene, könnten Sie

>>> ctrs[0].ContourSequence[0].ContourData 
['-200.0', '150.0', '-200.0', '-200.0', '-150.0', '-200.0', '200.0', '-150.0', ' 
-200.0', '200.0', '150.0', '-200.0', '-200.0', '150.0', '-200.0'] 

Diese zu verwenden sind Drillinge von (x, y, z) Koordinaten nacheinander.

Sie können mehr Informationen über jede Kontur (Name, usw.) in der StructureSetROISequence Sequenz für den Index finden, der durch Referenzierte ROI Nummer angegeben wird.

Sie könnten für alle ein vollständiges Array erstellen, indem Sie jeden Datensatz in der ContourSequence für diese bestimmte Kontur durchlaufen und sie zu einem Array zusammenfügen.

+0

Vielen Dank für Ihre Antwort. Und ja, das ist auch ziemlich genau das, wo ich gerade bin. Aber, und vielleicht mache ich es falsch, einige Konturen sind nicht das, was sie sollen. Es ist so, als ob diese Koordinaten nur den Umriss einer Kontur darstellen. Wenn die Kontur also ein Loch hat, etwa wenn Sie eine Blasenwand haben (zum Beispiel), scheint mir die Breite der Wand nicht zu sein, sondern eher die Umrisse der Kontur. Die Blasenwand- und Blasenkoordinaten sind also im Prinzip die gleichen, obwohl die Wand sowohl einen Umriß als auch eine Innenlinie haben sollte. Zumindest sehe ich das beim Plotten –

Verwandte Themen