leer imagenes imagen abrir python image format dicom medical

imagenes - dicom python



Archivos Parse DICOM en Python nativo (9)

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

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

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

  1. No es necesario crear ninguna biblioteca C / C ++ externa.
  2. Aprenda sobre el formato de archivo DICOM.

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

Intenté (en mi tiempo libre) escribir un analizador de dicomedio que tomaba mucho de un buen analizador de Ruby que encontré astutamente llamado '' ruby-dicom ''. En realidad, es un código muy legible (miré a una de las versiones anteriores más pequeñas).

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

Renuncié a la literatura oficial ya que solo estaba interesado en el formato de archivo que parece estar solo en uno de los 10 o más archivos PDF enormes.

Mis archivos DICOM locales no están comprimidos y siguen arreglos de bits estándar fáciles de codificar, pero prepárense para diversas compresiones y extrañas imágenes de 12 bits almacenadas en contenedores de 8 bits con gran o poca endianidad y sin bits de relleno ...

Me rendí una vez que el tiempo se volvió muy escaso.

Python es probablemente una opción mucho mejor que C para este estilo de análisis de encabezado aunque ...


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

No estaba muy impresionado con el código, pero es un Python nativo que lee archivos DICOM.


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 de Google para "DICOM python" dio varios resultados interesantes. Parece que este proyecto: http://www.creatis.univ-lyon1.fr/Public/Gdcm/ debe ofrecer lo que desea. Tiene enlaces de python y una lista de correo bastante activa.


Si desea conocer 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 completo DICOM es, por supuesto, la referencia definitiva, aunque es algo más intimidante. Está disponible en NEMA ( http://medical.nema.org ).

El formato de archivo es en realidad menos esotérico de lo que pueda imaginarse y consiste en 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. Siguiente el preámbulo es 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 en el archivo están ordenados por sus números de etiqueta DICOM. La imagen en sí misma es solo otro elemento de datos con un tamaño, representación de valores, etc.

Las representaciones de valores especifican exactamente cómo interpretar el valor. ¿Es un número? ¿Es una cadena de caracteres? Si se trata de 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 dice a qué entidad de información se aplica la etiqueta (por ejemplo, el grupo 0010 se refiere al paciente y el grupo 0020 hace referencia al estudio). El número del elemento identifica la interpretación del valor (elementos tales 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 otros detalles involucrados, pero esa es la esencia de esto. Probablemente lo más instructivo que puede hacer para aprender sobre el formato de archivo es tomar un ejemplo de archivo DICOM, mirarlo con un editor hexadecimal y pasar por el proceso de analizarlo mentalmente. Aconsejaría no intentar aprender sobre DICOM mirando las implementaciones de código abierto existentes, al menos inicialmente. Es más probable confundir en lugar de iluminar. Obtener una visión general es más importante. Una vez que tenga una idea general, podrá descender a las sutilezas.


El desarrollo de gdcm más nuevo ahora sucede aquí:

http://gdcm.sourceforge.net/

Admite Java y C # encima de python.

¿Por qué escribir otra implementación de dicom cuando puede centralizar una única implementación de C ++ y tenerla accesible a tantos idiomas diferentes?


La biblioteca pydicom mencionada anteriormente parece una gran biblioteca para acceder a las estructuras de datos de DICOM. Para usarlo para acceder, por ejemplo, a los datos de RT DOSE, supongo que uno 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 proporciona coordenadas erróneas y escalas de dosis, pero el principio debería ser correcto.

Los datos de CT deben ser muy similares.


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


Estoy usando pydicom en gran medida en estos días, y se mece.

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

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

Para obtener las cosas interesantes de ese objeto de "datos", de alguna manera se asemeja a la salida de 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)

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

¡Que te diviertas! :)