2008-09-23 12 views
17

Quelle est la manière la plus simple et la plus pythonique d'analyser un fichier DICOM?Analyser des fichiers DICOM en Python natif

Une implémentation Python native sans l'utilisation de bibliothèques non-Python serait très préférée. DICOM est le format de fichier standard en imagerie médicale numérique (voir here pour plus d'informations).

Il existe des bibliothèques C/C++ qui prennent en charge la lecture (un sous-ensemble) de fichiers DICOM. Deux ou trois d'entre eux ont même des liaisons Python. Un analyseur Python natif servirait à deux fins pour moi:

  1. Pas besoin de construire des bibliothèques C/C++ externes.
  2. En savoir plus sur le format de fichier DICOM.

Répondre

18

Et à partir d'aujourd'hui il y a un autre pur fichiers DICOM de lecture paquet Python disponible: pydicom

0

Je me demande ce que l'affiche originale a essayé et quelles méthodes ont fonctionné et n'ont pas fonctionné pour lui. Je n'ai jamais travaillé avec DICOM, mais une recherche rapide sur google pour "DICOM python" a donné plusieurs résultats intéressants. Il semble que ce projet: http://www.creatis.univ-lyon1.fr/Public/Gdcm/ devrait livrer ce que vous voulez. Il a des liaisons python et une liste de diffusion très active.

+0

Est-ce une « S'il vous plaît faire mes devoirs pour moi » question? –

+0

Non, à mon humble avis, j'ai fait mes devoirs: Il y a des bibliothèques C/C++ qui supportent la lecture (un sous-ensemble) de fichiers DICOM. Deux ou trois d'entre eux ont même des liaisons Python. Un analyseur Python natif servirait à deux fins pour moi: 1. Pas besoin de construire des bibliothèques C/C++. 2. En savoir plus sur le format de fichier DICOM. –

1

Il y a quelques bibliothèques (le plus souvent implémentés en C/C++) avec les liaisons Python, par exemple:

Cependant, je suis à la recherche d'un Python natif implémentation pour en savoir plus sur le format de fichier DICOM.

+0

les deux liens apparaissent pourris –

+0

@MonicaHeddneck Merci pour les heads-up; Je viens de mettre à jour les deux liens. –

3

Il y a quelques années, je cherchais la même chose et trouvé ceci: Python DICOM lib

je n'étais pas trop impressionné par le code, mais il est des fichiers DICOM de lecture Python natif.

9

Si vous voulez en savoir plus sur le format DICOM, « imagerie numérique et les communications en médecine (DICOM): Guide pratique Introduction et survie "par Oleg Pianykh est très lisible et donne une bonne introduction aux concepts clés de DICOM. Springer-Verlag est l'éditeur de ce livre. La norme DICOM complète est, bien sûr, la référence ultime bien qu'elle soit un peu plus intimidante. Il est disponible auprès de NEMA (http://medical.nema.org).

Le format de fichier est en fait moins ésotérique que vous pourriez l'imaginer et se compose d'un préambule suivi d'une séquence d'éléments de données. Le préambule contient le texte ASCII "DICM" et plusieurs octets réservés inutilisés. Après le préambule est une séquence d'éléments de données. Chaque élément de données comprend la taille de l'élément, un code ASCII à deux caractères indiquant la représentation de la valeur, une étiquette DICOM et la valeur. Les éléments de données dans le fichier sont classés par leur numéro de tag DICOM. L'image elle-même est juste un autre élément de données avec une taille, une représentation de valeur, etc.

Les représentations de valeur spécifient exactement comment interpréter la valeur. Est-ce un numéro? Est-ce une chaîne de caractères? Si c'est une chaîne de caractères, est-ce court ou long et quels caractères sont autorisés? Le code de représentation de la valeur vous le dit.Une étiquette DICOM est un code hexadécimal de 4 octets composé d'un nombre de "groupe" de 2 octets et d'un nombre "d'éléments" de 2 octets. Le numéro de groupe est un identificateur qui vous indique à quelle entité d'information l'étiquette s'applique (par exemple, le groupe 0010 fait référence au patient et le groupe 0020 à l'étude). Le numéro d'élément identifie l'interprétation de la valeur (éléments tels que le numéro d'identification du patient, la description de la série, etc.). Pour savoir comment interpréter la valeur, votre code recherche la balise DICOM dans un fichier de dictionnaire.

Il y a d'autres détails en jeu, mais c'est l'essentiel. Probablement la chose la plus instructive que vous pouvez faire pour en apprendre davantage sur le format de fichier est de prendre un exemple de fichier DICOM, regardez-le avec un éditeur hexadécimal, et passez par le processus de l'analyser mentalement. Je déconseillerais d'essayer d'en savoir plus sur DICOM en examinant les implémentations Open Source existantes, du moins au début. Il est plus probable de confondre au lieu d'éclairer. Obtenir la grande image est plus important. Une fois que vous avez la grande image, vous pouvez descendre dans les subtilités.

4

développement récent de gdcm arrive maintenant ici:

http://gdcm.sourceforge.net/

Il prend en charge Java et C# sur le dessus de python.

Pourquoi écrire encore une autre mise en œuvre DICOM lorsque vous pouvez centraliser une seule implémentation C++ et l'ont accessible à tant de langues différentes

7

La bibliothèque pydicom mentionné ci-dessus semble comme une grande bibliothèque pour accéder aux structures de données DICOM. Pour l'utiliser pour accéder par ex. données RT DOSE, je suppose qu'on ferait quelque chose comme

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

puis, si vous êtes dans mayavi,

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

Cela donne mal coordonnées et mise à l'échelle de la dose, mais le principe doit être son .

Les données CT devraient être très similaires.

17

J'utilise beaucoup pydicom ces jours-ci, et ça berce.

Il est assez facile de commencer à jouer avec:

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

Pour obtenir les choses intéressantes sur cet objet « de données », ressemblant en quelque sorte dcmdump sortie:

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) 

Je pense un excellent moyen pour en savoir plus sur le format dicom est d'ouvrir des fichiers similaires et d'écrire du code pour les comparer selon différents aspects: la description de l'étude, la largeur de la fenêtre et le centre, la représentation des pixels et ainsi de suite.

Amusez-vous! :)

+2

J'ai trouvé beaucoup de documentation qui indique 'import pydicom'. Pour moi, avec la version 0.9.9 ci-dessus ('import dicom') était le bon nom de module, malgré l'avoir installé avec' python -m pip install pydicom'. –

2

DICOM est une vraie douleur ... même lorsque le fabricant s'en tient aux normes. Si vous écrivez votre propre bibliothèque DICOM, vous trouverez différents fabricants DICOM sont effectivement incompatibles avec d'autres fournisseurs [la citation nécessaire].

J'ai essayé (dans mon temps libre) d'écrire un analyseur C dicom empruntant lourdement à un joli petit analyseur Ruby que je suis tombé habilement appelé 'ruby-dicom'.C'est en fait un code très lisible (j'ai regardé l'une des versions antérieures plus petites).

Le plus gros casse-tête consistait à essayer de rassembler une bibliothèque de balises d'en-tête avec des types de données attendus. Il y a les balises définies par défaut et les balises du fournisseur. Les fichiers ruby-dicom contiennent une bibliothèque de balises dans un format texte qui peut être facilement inspecté. J'ai renoncé à la littérature officielle, car je ne m'intéressais qu'au format de fichier qui semble n'être que l'un des quelque 10 gros fichiers PDF. Mes fichiers DICOM locaux ne sont pas compressés et suivent des arrangements de bits standard faciles à coder, mais soyez préparés pour diverses compressions et étranges images 12 bits stockées dans des conteneurs de 8 bits avec peu ou pas d'endianness et pas de bits de rembourrage. J'ai abandonné une fois que le temps est devenu très rare.

Python est probablement un choix beaucoup mieux que C pour ce style de parsing d'en-tête mais ...

Questions connexes