Pregunta

¿Cuál es la forma más sencilla y pitónica de analizar un archivo DICOM?

Sería preferible una implementación nativa de Python sin el uso de bibliotecas que no sean de Python.DICOM es el formato de archivo estándar en imágenes médicas digitales (ver aquí para más información).

Existen algunas bibliotecas C/C++ que admiten la lectura (un subconjunto) de archivos DICOM.Dos o tres de ellos incluso tienen enlaces de Python.Un analizador nativo de Python me serviría para dos propósitos:

  1. No es necesario crear bibliotecas C/C++ externas.
  2. Obtenga más información sobre el formato de archivo DICOM.
¿Fue útil?

Solución

Y a partir de hoy hay otro paquete Python puro que lee archivos DICOM disponible: pydicom

Otros consejos

Estoy usando pydicom mucho estos días, y es genial.

Es bastante fácil empezar a jugar con él:

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

Para sacar lo interesante de ese objeto de "datos", que de alguna manera se parece dcmdump producción:

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)

Creo que una excelente manera de aprender más sobre el formato dicom es abrir archivos similares y escribir código para compararlos según varios aspectos:descripción del estudio, ancho y centro de la ventana, representación de píxeles, etc.

¡Divertirse!:)

Si desea obtener información sobre el formato DICOM, "Imágenes digitales y comunicaciones en medicina (DICOM):Una guía práctica de introducción y supervivencia" de Oleg Pianykh es bastante legible y ofrece una buena introducción a los conceptos clave de DICOM.Springer-Verlag es el editor de este libro.El estándar DICOM completo es, por supuesto, la referencia definitiva, aunque resulta algo más intimidante.Está disponible en NEMA (http://medical.nema.org).

En realidad, el formato del archivo es menos esotérico de lo que imagina y consta de un preámbulo seguido de una secuencia de elementos de datos.El preámbulo contiene el texto ASCII "DICM" y varios bytes reservados que no se utilizan.Después del preámbulo hay una secuencia de elementos de datos.Cada elemento de datos consta del tamaño del elemento, un código ASCII de dos caracteres que indica la representación del valor, una etiqueta DICOM y el valor.Los elementos de datos del archivo están ordenados por sus números de etiqueta DICOM.La imagen en sí es simplemente otro elemento de datos con un tamaño, representación de valor, etc.

Las representaciones de valores especifican exactamente cómo interpretar el valor.¿Es un número?¿Es una cadena de caracteres?Si es una cadena de caracteres, ¿es corta o larga y qué caracteres están permitidos?El código de representación del valor te dice esto.

Una etiqueta DICOM es un código hexadecimal de 4 bytes compuesto por un número de "grupo" de 2 bytes y un número de "elemento" de 2 bytes.El número de grupo es un identificador que le indica a qué entidad de información se aplica la etiqueta (por ejemplo, el grupo 0010 se refiere al paciente y el grupo 0020 se refiere al estudio).El número de elemento identifica la interpretación del valor (elementos como el número de identificación del paciente, la descripción de la serie, etc.).Para saber cómo debe interpretar el valor, su código busca la etiqueta DICOM en un archivo de diccionario.

Hay algunos otros detalles involucrados, pero esa es la esencia del asunto.Probablemente lo más instructivo que puede hacer para aprender sobre el formato de archivo es tomar un archivo DICOM de ejemplo, mirarlo con un editor hexadecimal y realizar el proceso de análisis mental.Yo desaconsejaría intentar aprender sobre DICOM observando las implementaciones de código abierto existentes, al menos inicialmente.Es más probable que confunda que esclarezca.Obtener el panorama general es más importante.Una vez que tengas el panorama general, podrás descender a las sutilezas.

La biblioteca pydicom mencionado anteriormente parece una gran biblioteca para acceder a las estructuras de datos DICOM.Para usarlo para acceder, p.Datos RT DOSE, supongo que se haría algo como

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

y luego, si estás en mayavi,

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

Esto da coordenadas y escalas de dosis erróneas, pero el principio debería ser sólido.

Los datos de TC deberían ser muy similares.

El desarrollo más reciente de gdcm ahora ocurre aquí:

http://gdcm.sourceforge.net/

Es compatible con Java y C# además de Python.

por que escribir aún otra Implementación de dicom cuando puedes centralizar una única implementación de C++ y hacerla accesible a tantos lenguajes diferentes.

Hace algunos años estaba buscando lo mismo y encontré esto:Biblioteca DICOM de Python

No me impresionó mucho el código, pero es Python nativo que lee archivos DICOM.

DICOM es un verdadero dolor...incluso cuando el fabricante se apega a los estándares.Si escribe su propia biblioteca DICOM, encontrará que los DICOM de diferentes fabricantes son efectivamente incompatibles con otros proveedores [cita requerida].

Intenté (en mi tiempo libre) escribir un analizador C dicom tomando prestado en gran medida un pequeño y agradable analizador Ruby que encontré astutamente llamado 'rubí-dicom'.En realidad, es un código muy legible (miré una de las versiones anteriores más pequeñas).

El mayor dolor de cabeza fue intentar acumular una biblioteca de etiquetas de encabezado con los tipos de datos esperados.Están las etiquetas definidas estándar y las etiquetas de proveedor.Los archivos ruby-dicom contienen una biblioteca de etiquetas en formato de texto que se puede inspeccionar fácilmente.

Renuncié a la literatura oficial porque solo me interesaba el formato de archivo, que parece estar solo en uno de los aproximadamente 10 archivos PDF de gran tamaño.

Mis archivos DICOM locales no están comprimidos y siguen disposiciones de bits estándar fáciles de codificar, pero prepárese para diversas compresiones e imágenes extrañas de 12 bits almacenadas en contenedores de 8 bits con endianidad grande o pequeña y sin bits de relleno...

Me di por vencido una vez que el tiempo se volvió muy escaso.

Sin embargo, Python es probablemente una opción mucho mejor que C para este estilo de análisis de encabezados...

Hay algunas bibliotecas (la mayoría de las veces implementadas en C/C++) con enlaces de Python, por ejemplo:

Sin embargo, estoy buscando una implementación nativa de Python para aprender más sobre el formato de archivo DICOM.

Me pregunto qué intentó el cartel original y qué métodos funcionaron y no funcionaron para él.Nunca he trabajado con DICOM, pero una búsqueda rápida en Google de "DICOM python" arrojó varios resultados interesantes.Parece que este proyecto: http://www.creatis.univ-lyon1.fr/Public/Gdcm/ debe entregar lo que desea.Tiene enlaces de Python y una lista de correo bastante activa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top