Visualización de imágenes DICOM
Para realizar el visualizador de imágenes DICOM se ha utilizado el lenguaje Python por su diseño modular y su orientación a objetos. Aun así, el código es fácilmente modificable para que se adapte a lenguajes como MATLAB u Octave (General Python FAQ - Python 3.14.0., s.f.)
Específicamente, se han utilizado las librerías siguientes:
tkinter, para generar Interfaces de Usuario Gráficas (GUI) con el uso del kit de herramientas Tk. Merecen mención las librerías font, filedialog, ttk y messagebox, que permiten acceder a elementos gráficos más avanzados, interactuar con el sistema de archivos y generar tipografías (Tkinter - Python Interface to Tcl/Tk, s.f.)pydicom, como marco para leer y decodificar imágenes en estándar DICOMPIL. La librería pillow permite la manipulación de imágenes mediante las clases Image, ImageTk e ImageFilter (Pillow (PIL Fork) 12.0.0 documentation, s.f.)os, para poder trabajar con llamadas a sistema y rutas de acceso a disco.Podemos resumir la funcionalidad de la aplicación de la siguiente forma:
Vistas las características de la aplicación, procedemos a explicar el código del programa:
Al trabajar en un lenguaje interpretado como Python, es preciso que las declaraciones de clases, métodos y funciones se hagan antes de su llamada desde el programa principal. Así comienza el archivo con la creación de una clase llamada Dicom. Esta clase se encargará de cargar, procesar y modificar los archivos que se visualizan. Entre los métodos de la clase se encuentran los siguientes:
cargarDicom(), encargado de mostrar un diálogo para abrir un archivo, comprobando su correcta apertura. Se genera una matriz de píxeles y una imagen manipulable. Por último, se genera una fotografía para actualizar el label correspondiente a la imagen, almacenado en labelOriginal.copiaOriginal(), que permite que la imagen original (sea procesada o no) pase a ser la procesada. A nivel práctico, elimina todos los filtros puestos después de introducir una imagen como original.hacerOriginal(), que permite aplicar filtros sobre una imagen procesada, convirtiéndola en original. Una vez hecha una imagen original, no es posible recuperar la anterior.filtro*():filtroGaussiano(). Toma un argumento, cant, que se introduce con una escala. Este argumento permite definir la intensidad del filtro Gaussiano que realiza la función, para saber cuántas filas tendrá la matriz cuadrada de filtrado de la imagen.filtroLineal(). Función idéntica a la descrita con anterioridad, con la excepción de que el filtro no pondera los píxeles entorno al centro.filtroMediana(), que realiza un filtro de mediana, especificando con el parámetro el número de elementos de la distribución. Nótese la necesidad de especificar un parámetro impar. Si no ocurre esto, se muestra un error, instando al cambio.Estos filtros han podido hacerse gracias a la clase ImageFilter que incorpora la librería Pillow. Dentro de esta clase se encuentran distintos métodos para filtrar imágenes.
Daremos cuenta a continuación de las limitaciones de la aplicación:
grid de tkinter. Se podría considerar una aproximación diferente mediante otro tipo de trabajo con la tecnología pack.Vistas algunas de las limitaciones del aplicativo, procedemos a enlazar algunas capturas de pantalla de la aplicación. Todas ellas se han realizado en un equipo corriendo Debian 13 con arquitectura de 64 bits:
Para trabajar con las imágenes abrimos una imagen haciendo clic sobre el botón Abrir imagen:
filedialog para abrir un archivo.La imagen abierta queda de la siguiente forma:
A partir de aquí, se pueden introducir filtros, obteniendo los siguientes resultados:
|
|
|
|
Vemos en esta figura como los filtros lineal y gaussiano reducen el ruido de la imagen. Sin embargo, se pierde definición de borde. En otro orden de cuestiones, el filtro de mediana reduce ruido evitando la falta de definición en los bordes, que se ven correctamente.
Podemos también ver cómo se utilizan las funcionalidades Hacer original y Quitar filtros:
|
|
Por último se muestra el error generado cuando intentamos trabajar con el filtro de mediana en tamaños pares:
Este laboratorio ha permitido el acercamiento a la realidad del procesado de imágenes mediante el desarrollo e implementación de una interfaz gráfica de usuario para procesar imágenes médicas en el archivo estándar DICOM. Se ha dado cuenta de los pasos, cuestiones relevantes y dependencias del programa, con el objeto de permitir la reproducción de la aplicación en ocasiones futuras. Se adjunta, asimismo, el código de la aplicación para su visualización.
Las imágenes se han obtenido de Dicom Library - Anonymize, Share, View Dicom Files Online (s.f.).
General Python FAQ - Python 3.14.0. (s.f). Python Documentation. https://docs.python.org/3/faq/general.html
Tkinter - Python interface to Tcl/Tk. (s.f). Python Documentation. https://docs.python.org/3/library/tkinter.html
Pillow. (s.f.). Pillow (PIL Fork). https://pillow.readthedocs.io/en/stable/index.html
Dicom library - Anonymize, share, view dicom files online. (s.f.) https://www.dicomlibrary.com/?manage=02ef8f31ea86a45cfce6eb297c274598