Question

Quel est le moyen le plus simple et le plus pythonique d'analyser un fichier DICOM?

Une implémentation Python native sans utilisation de bibliothèques autres que Python serait de loin préférable. DICOM est le format de fichier standard en imagerie médicale numérique ( ici pour plus d'informations).

Certaines bibliothèques C / C ++ 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 me servirait à deux fins:

  1. Inutile de créer des bibliothèques externes C / C ++.
  2. En savoir plus sur le format de fichier DICOM.
Était-ce utile?

La solution

Et à partir d’aujourd’hui, un autre paquet pur Python lit les fichiers DICOM disponibles: pydicom

.

Autres conseils

J'utilise pydicom , et tout est génial.

C'est assez facile de commencer à jouer avec:

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

Pour extraire le contenu intéressant de ces " données " objet, ressemblant en quelque sorte à la dcmdump :

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 qu'un bon moyen d'en savoir plus sur le format dicom est d'ouvrir des fichiers similaires et d'écrire du code pour les comparer selon divers aspects: description de l'étude, largeur et centre de la fenêtre, représentation en pixels, etc.

.

Amusez-vous! :)

Si vous souhaitez en savoir plus sur le format DICOM, consultez "Guide d'imagerie numérique et de communication en médecine (DICOM): introduction pratique et guide de survie". Oleg Pianykh est très lisible et constitue 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 réalité moins ésotérique que vous ne le pensez 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 qui ne sont pas utilisés. Le préambule est suivi d’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 balise DICOM et la valeur. Les éléments de données du fichier sont classés en fonction de leurs numéros d’étiquette DICOM. L'image elle-même n'est qu'un autre élément de données avec une taille, une représentation des valeurs, 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? S'il s'agit d'une chaîne de caractères, s'agit-il d'une chaîne courte ou d'une chaîne longue et quels caractères sont autorisés? Le code de représentation de valeur vous le dit.

Une balise DICOM est un code hexadécimal de 4 octets composé d'un "groupe" de 2 octets. nombre et un "élément" de 2 octets nombre. Le numéro de groupe est un identifiant qui vous indique à quelle entité d'information l'étiquette s'applique (par exemple, le groupe 0010 se réfère 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. La chose la plus instructive que vous puissiez faire pour en savoir plus sur le format de fichier est de prendre un exemple de fichier DICOM, de le consulter avec un éditeur hexadécimal et de le analyser mentalement. Je vous déconseille d'essayer de vous familiariser avec DICOM en regardant les implémentations open source existantes, du moins au début. Il est plus probable de confondre au lieu d’éclairer. Obtenir une vue d'ensemble est plus important. Une fois que vous avez une vue d'ensemble, vous pouvez alors descendre dans les subtilités.

La bibliothèque pydicom mentionnée ci-dessus semble être une excellente bibliothèque pour accéder aux structures de données DICOM. Pour l'utiliser pour accéder, par exemple, à Données RT DOSE, je suppose que l’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))

et puis, si vous êtes dans mayavi,

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

Cela donne de mauvaises coordonnées et une mauvaise échelle de dose, mais le principe devrait être valable.

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

Les nouveaux développements de gdcm se produisent maintenant ici:

http://gdcm.sourceforge.net/

Il prend en charge Java et C # en plus de python.

Pourquoi écrire encore une implémentation dicom lorsque vous pouvez centraliser une implémentation C ++ unique et la rendre accessible à de nombreux langages différents

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

Le code ne m'a pas trop impressionné, mais il s'agit de fichiers DICOM en lecture Python natifs.

DICOM est une vraie douleur ... même lorsque le fabricant respecte les normes. Si vous écrivez votre propre bibliothèque DICOM, vous découvrirez que les DICOM de différents fabricants sont incompatibles avec d'autres fournisseurs [citation requise].

J’ai essayé (pendant mon temps libre) d’écrire un analyseur C dicom empruntant énormément à un joli petit analyseur Ruby que j’ai trouvé astucieusement appelé " ruby-dicom '. Il s’agit d’un code très lisible (j’ai jeté un coup d’œil à l’une des versions antérieures les plus petites).

Le principal problème était d'essayer de créer une bibliothèque de balises d'en-tête avec les types de données attendus. Il existe les balises définies par défaut et les balises de fournisseur. Les fichiers ruby-dicom contiennent une bibliothèque de balises dans un format texte qui peut être facilement inspecté.

J'ai abandonné la littérature officielle car je ne m'intéressais qu'au format de fichier, qui ne semble figurer que dans l'un des 10 très gros fichiers PDF.

Mes fichiers DICOM locaux ne sont pas compressés et respectent les arrangements de bits standard faciles à coder, mais soyez prêts à recevoir diverses compressions et d'étranges images 12 bits stockées dans des conteneurs 8 bits à grande ou faible endianité et sans bits de remplissage ...

J'ai abandonné une fois que le temps est devenu très rare.

Python est probablement un bien meilleur choix que le C pour ce style d’en-tête mais ...

Il existe certaines bibliothèques (le plus souvent implémentées en C / C ++) avec des liaisons Python, par exemple:

Toutefois, je recherche une implémentation Python native pour en savoir plus sur le format de fichier DICOM.

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 rapide recherche sur Google pour "python DICOM". a donné plusieurs résultats intéressants. Il semble que ce projet: http://www.creatis.univ-lyon1.fr / Public / Gdcm / devrait fournir ce que vous voulez. Il a des liaisons en python et une liste de diffusion assez active.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top