2017-10-10 7 views
7

Donc, si j'ai une image (CT, IRM, etc.) ou même une dose de radiothérapie je peux retirer les valeurs de dose ou image dans un tableau par:Obtenir les contours de la structure DICOM comme tableau en Python

import dicom 

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

print ds.pixel_array 

Ceci est assez simple, et me donne la possibilité de manipuler des images/doses que je veux. Cependant, vous avez souvent aussi un fichier de structure qui inclut différentes structures profilées que vous pouvez ensuite voir dans une visionneuse d'image ou quelque chose comme ça. Encore une fois, assez simple.

Mon problème est que je voudrais aussi ces structures individuelles en tant que tableau. Et si je cours le même code je reçois juste TypeError: No pixel data found in this dataset.

Je suppose que les fichiers DICOM de structure ne sont pas "faits" de la même manière que les fichiers DICOM de dose/images.

Y a-t-il une solution à cela que je n'ai pas trouvée? J'ai également regardé le paquet dicompyler_core, mais d'après ce que j'ai pu voir, il n'y avait aucun moyen de "juste" sortir les différentes structures en tableaux.

+1

Veuillez indiquer l'UID de classe SOP du fichier DICOM en question afin que nous sachions comment l'information est codée. –

+0

@kritzel_sw Oh, désolé pour la réponse lente. Si j'utilise la balise "SOP Class UID" sur mon fichier de structure, je reçois: RT Structure Set Storage. Je ne sais pas si c'est ce que vous demandiez? –

Répondre

2

Voici une session interactive illustrant la mise en page de données en utilisant le fichier rtstruct.dcm inclus avec 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' 

Les données sont stockées (dans ce cas, comme d'habitude) comme un ensemble de coordonnées pour chaque avion. Pour obtenir les données d'un contour, pour un plan, vous pouvez utiliser

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

Ce sont des triplés de (x, y, z) les coordonnées les unes après les autres.

Vous pouvez trouver plus d'informations sur chaque contour (nom, etc.) dans la séquence StructureSetROISequence, pour l'indice donné par le numéro de retour sur investissement référencé.

Vous pouvez obtenir un tableau complet pour tous ces éléments en faisant défiler chaque ensemble de données dans ContourSequence pour ce contour particulier et en les ajoutant ensemble dans un tableau.

+0

Merci d'avoir répondu. Et oui, c'est aussi à peu près où je suis en ce moment. Mais, et peut-être que je le fais dans le mauvais sens, certains contours ne sont pas ce qu'ils sont censés faire. C'est comme si ces coordonnées faisaient seulement le contour d'un contour. Donc, si le contour a un trou, comme lorsque vous avez un mur de la vessie (par exemple), je ne semble pas avoir la largeur du mur, mais plutôt le contour du contour. Donc, en principe, les coordonnées de la paroi de la vessie et de la vessie sont à peu près les mêmes, même si le mur doit avoir un contour ainsi qu'une ligne intérieure. Au moins c'est ce que je vois en traçant –