2017-10-10 31 views
7

Więc jeśli mam obrazu (CT, MRI, etc.) lub nawet od dawki radioterapii mogę wyciągnąć wartości dawki lub obrazu do tablicy przez:Getting kontury struktura DICOM jak tablicy w Pythonie

import dicom 

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

print ds.pixel_array 

Jest to bardzo proste i daje mi możliwość manipulowania obrazami/dawkami tak, jak chcę. Jednak często masz również plik struktury, który zawiera różne wyprofilowane struktury, które można następnie zobaczyć w przeglądarce obrazów lub coś podobnego. Ponownie, całkiem proste.

Mój problem polega na tym, że chciałbym również, aby te poszczególne struktury były również tablicą. A jeśli uruchomię ten sam kod, otrzymam tylko

Zgaduję, że struktura plików DICOM nie jest "wykonana" w taki sam sposób, jak pliki DICOM dla dawki/obrazów.

Czy istnieje rozwiązanie tego problemu, którego nie mogłem znaleźć? Przyjrzałem się także pakietowi dicompyler_core, ale z tego, co widziałem, nie było sposobu, aby "po prostu" wydobyć różne struktury do tablic.

+1

Proszę podać identyfikator UID klasy SOP danego pliku DICOM, abyśmy wiedzieli, w jaki sposób są kodowane informacje. –

+0

@kritzel_sw Och, przepraszam za powolną odpowiedź. Jeśli użyję tagu "SOP Class UID" w moim pliku struktury, otrzymam: RT Structure Set Storage. Nie wiem, czy o to prosiłeś? –

Odpowiedz

2

Oto interaktywna sesja ilustrujący układ danych przy użyciu pliku rtstruct.dcm dołączone pydicom:

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

Dane są przechowywane (w tym przypadku, jak to zwykle bywa) za pomocą współrzędnych dla każdego samolot. Aby uzyskać dane dla jednego konturu, na jednej płaszczyźnie, można użyć

>>> 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'] 

Są trojaczki z (x, y, z) koordynuje jedna po drugiej.

Możesz uzyskać więcej informacji o każdym konturze (nazwa itp.) W sekwencji StructureSetROISequence dla indeksu podanego w referencyjnym numerze ROI.

Możesz uzyskać kompletną tablicę dla wszystkich tych elementów, przechodząc przez każdy zestaw danych w ContourSequence dla danego konturu i dołączając je do jednej tablicy.

+0

Dziękuję za odpowiedź. I tak, jest to również miejsce, w którym teraz jestem. Ale i może robię to w niewłaściwy sposób, niektóre kontury nie są takie, jak powinny. To tak, jak te współrzędne tylko zarysu konturu. Więc jeśli kontur ma w sobie dziurę, na przykład, gdy masz ścianę pęcherza (na przykład), nie wydaje mi się, aby uzyskać szerokość ściany, ale bardziej tylko kontur konturu. Zasadniczo ścianki pęcherza i współrzędne pęcherza są prawie takie same, mimo że ściana powinna mieć zarys, a także linię wewnętrzną. Przynajmniej to widzę podczas kreślenia –