Hace tiempo que no he posteado nada y es porque he estado trabajando en un pequeño proyecto sobre ECG. La idea es simple: tomar una imagen con las 12 derivaciones, limpiar el ruido del papel y separar cada derivación en su propio recorte.

Este proyecto vive en physionet (una competencia en Kaggle) y lo estoy armando con Python + OpenCV. El flujo actual es:

  1. Convertir a HSV y crear una máscara binaria para quedarme con los trazos.
  2. Limpiar la máscara con una ventana de densidad (filtro por píxeles activos).
  3. Detectar filas con señal y cortar por columnas según proporciones fijas.
  4. Calcular bounding boxes y guardar cada derivación en archivos separados.

Para que se vea el proceso, aquí dejo algunas imágenes del pipeline.

1) Imagen original

ECG original

2) Máscara binaria luego de la limpieza

Máscara binaria

3) Detección de bounding boxes por derivación

Bounding boxes

Lo que más me está gustando es que, con pocos parámetros, ya logro una separación estable en la mayoría de los casos. Por ejemplo: en estas dos muestras las derivaciones salen limpias casi desde el primer intento:

ECG ejemplo limpio 1 ECG ejemplo limpio 2

Esto se debe a que estas imágenes no presentan ningún tipo de ruido. En cambio, en esta imagen la cuadrícula se nota más y tuve que subir un poco el umbral de densidad para que no se mezclen las filas:

ECG con cuadrícula marcada

Aquí se ve el binario de esa misma muestra, donde la limpieza se daña por la fuerza de la cuadrícula:

Binario dañado en test-0012

Imagen limpia sin cuadrícula

ECG limpio sin cuadrícula

Por el momento es todo lo que llevo. Estoy trabajando en mejorar una forma de eliminar todo ese tipo de ruido en la imagen y solo obtener, en su mayoría, las señales ECG para procesarlas con redes convolucionales.