Domanda

Qual è il modo più semplice e più pitone per analizzare un file DICOM?

Un'implementazione nativa di Python senza l'uso di librerie non Python sarebbe molto preferita. DICOM è il formato di file standard nell'imaging medico digitale (consultare qui per ulteriori informazioni).

Esistono alcune librerie C / C ++ che supportano la lettura (un sottoinsieme) di file DICOM. Due o tre di loro hanno persino attacchi Python. Un parser nativo Python avrebbe due scopi per me:

  1. Non è necessario creare librerie C / C ++ esterne.
  2. Informazioni sul formato file DICOM.
È stato utile?

Soluzione

E ad oggi c'è un altro pacchetto Python puro che legge i file DICOM disponibili: pydicom

Altri suggerimenti

Sto usando pydicom in questi giorni, e si rompe.

È abbastanza facile iniziare a giocarci:

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

Per ottenere le cose interessanti da quei "dati" oggetto, in qualche modo simile a dcmdump output:

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)

Penso che un ottimo modo per saperne di più sul formato dicom sia aprire file simili e scrivere codice per confrontarli in base a vari aspetti: descrizione dello studio, larghezza e centro della finestra, rappresentazione dei pixel e così via.

Buon divertimento! :)

Se vuoi conoscere il formato DICOM, " Digital Imaging and Communications in Medicine (DICOM): una guida pratica di introduzione e sopravvivenza " di Oleg Pianykh è abbastanza leggibile e offre una buona introduzione ai concetti chiave di DICOM. Springer-Verlag è l'editore di questo libro. L'intero standard DICOM è, ovviamente, il riferimento ultimo sebbene sia un po 'più intimidatorio. È disponibile da NEMA ( http://medical.nema.org ).

Il formato del file è in realtà meno esoterico di quanto si possa immaginare e consiste in un preambolo seguito da una sequenza di elementi di dati. Il preambolo contiene il testo ASCII "DICM" e diversi byte riservati non utilizzati. Segue il preambolo è una sequenza di elementi di dati. Ogni elemento di dati è costituito dalla dimensione dell'elemento, un codice ASCII di due caratteri che indica la rappresentazione del valore, un tag DICOM e il valore. Gli elementi di dati nel file sono ordinati in base al numero di tag DICOM. L'immagine stessa è solo un altro elemento di dati con dimensioni, rappresentazione del valore, ecc.

Le rappresentazioni di valore specificano esattamente come interpretare il valore. È un numero? È una stringa di caratteri? Se è una stringa di caratteri, è corta o lunga e quali caratteri sono consentiti? Il codice di rappresentazione del valore ti dice questo.

Un tag DICOM è un codice esadecimale di 4 byte composto da un "gruppo" da 2 byte numero e un elemento di 2 byte "quot" numero. Il numero di gruppo è un identificatore che indica a quale entità di informazioni si applica il tag (ad esempio, il gruppo 0010 si riferisce al paziente e il gruppo 0020 si riferisce allo studio). Il numero dell'elemento identifica l'interpretazione del valore (elementi come il numero ID del paziente, la descrizione della serie, ecc.). Per scoprire come interpretare il valore, il codice cerca il tag DICOM in un file di dizionario.

Ci sono alcuni altri dettagli coinvolti, ma questa è l'essenza. Probabilmente la cosa più istruttiva che puoi fare per conoscere il formato del file è prendere un esempio di file DICOM, guardarlo con un editor esadecimale e seguire il processo di analisi mentale. Vorrei sconsigliare di provare a conoscere DICOM osservando le implementazioni open source esistenti, almeno inizialmente. È più probabile che confonda invece di illuminare. Ottenere il quadro generale è più importante. Una volta che hai il quadro generale, puoi scendere in sottigliezze.

La libreria pydicom sopra menzionata sembra una grande biblioteca per accedere alle strutture di dati DICOM. Per usarlo per accedere ad es. Dati RT DOSE, immagino che uno farebbe qualcosa del genere

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

e poi, se sei in mayavi,

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

Ciò fornisce coordinate e ridimensionamento della dose errati, ma il principio dovrebbe essere valido.

I dati CT dovrebbero essere molto simili.

Lo sviluppo di gdcm più recente ora avviene qui:

http://gdcm.sourceforge.net/

Supporta Java e C # su Python.

Perché scrivere ancora un'altra dicom implementazione quando puoi centralizzare una singola implementazione C ++ e averla accessibile in così tante lingue diverse

Alcuni anni fa stavo cercando la stessa cosa e ho trovato questo: Python DICOM lib

Non sono rimasto molto colpito dal codice, ma è Python nativo che legge i file DICOM.

DICOM è un vero dolore ... anche quando il produttore rispetta gli standard. Se scrivi la tua libreria DICOM scoprirai che DICOM diversi produttori sono effettivamente incompatibili con altri fornitori [citazione necessaria].

Ho provato (nel mio tempo libero) a scrivere un parser C dicom che prende in prestito pesantemente da un simpatico parser Ruby che mi sono imbattuto astutamente chiamato ' ruby-DICOM '. In realtà è un codice molto leggibile (ho visto una delle versioni precedenti più piccole).

Il più grande mal di testa stava provando ad accumulare una libreria dei tag header con i tipi di dati previsti. Esistono i tag definiti standard e i tag del fornitore. I file ruby-dicom contengono una libreria di tag in un formato di testo che può essere facilmente ispezionato.

Ho rinunciato alla letteratura ufficiale perché mi interessava solo il formato del file che sembra essere solo in uno dei 10 o più grandi PDF.

I miei file DICOM locali non sono compressi e seguono disposizioni di bit standard facili da codificare, ma sono pronti per varie compressioni e strane immagini a 12 bit archiviate in contenitori a 8 bit con endianness grande o piccola e senza bit di riempimento ...

Ho rinunciato una volta che il tempo è diventato molto scarso.

Python è probabilmente una scelta molto migliore di C per questo stile di analisi delle intestazioni, però ...

Esistono alcune librerie (spesso implementate in C / C ++) con collegamenti Python, ad es .:

Tuttavia, sto cercando un'implementazione nativa di Python per saperne di più sul formato di file DICOM.

Mi chiedo cosa abbia provato il poster originale e quali metodi funzionassero e non funzionassero per lui. Non ho mai lavorato con DICOM, ma una rapida ricerca su Google di " DICOM python " ha dato diversi risultati interessanti. Sembra che questo progetto: http://www.creatis.univ-lyon1.fr / Public / Gdcm / dovrebbe offrire ciò che desideri. Ha i collegamenti Python e una mailing list piuttosto attiva.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top