¿Cómo recupero la señal de una imagen de ECG?

14

En mi proyecto, tengo que digitalizar una imagen de ECG tomada con una cámara normal (JPEG). Por ejemplo, tengo la siguiente imagen capturada de la cámara:

antes de

y quiero obtener algo como esto:

Después

y luego los datos digitalizados (puntos x, y), como en este video sobre digitalización de ECG

No tengo idea de cómo hacerlo, así que busqué y consulté varios trabajos de investigación. El enfoque general de los algoritmos es como: -

  1. cambiar a imagen de nivel de gris
  2. eliminar líneas de cuadrícula
  3. agregar puntos faltantes
  4. convertir imagen 2D a imagen 1D

Estoy atascado con el segundo punto, es decir, eliminar las líneas de la cuadrícula. Busqué algunas referencias más para hacer esto y descubrí que el análisis de histograma podría ser útil.

¿Pueden guiarme sobre cómo hacer esto (estoy usando MATLAB 2010)? Cualquier ayuda sería apreciada.

Deepak
fuente
Básicamente pregunté lo mismo aquí: stackoverflow.com/q/1657941/125507
endolith
@ Deepak, que parece que haya implementado la parte Matlab del código mencionado en el post, se puede compartir la amabilidad de la parte MATLAB donde va a convertir la imagen escaneada a la señal 1D para la interpolación
user3278

Respuestas:

16

Lo siento, uso Mathematica, pero debería ser realmente fácil implementar la idea en Matlab. Le doy el código de todos modos, así que cuando mi descripción no sea lo suficientemente detallada, puede obtener el resto del código.

La idea básica es: miras tu imagen en forma de columna. Procese cada columna de píxeles por separado. Tenga en cuenta que en el gráfico, invertí los valores grises. Entonces, el negro es 1 y el blanco es 0.
Si traza los valores de píxeles de brillo (invertidos), básicamente tiene solo dos situaciones. El primero es, cuando su columna no está en una línea de cuadrícula vertical. El argumento se parece a

La segunda situación es, donde estás directamente en una línea de cuadrícula vertical. Entonces la línea de la cuadrícula influye en el brillo de toda la columna.

Pero lo que ves es que tu EEG oscuro parece ser siempre el máximo. Por lo tanto, el algoritmo muy complejo es: ir a través de cada columna y tomar la posición del píxel más negro.

img = ColorConvert[
   ImagePad[
    Import["http://i.stack.imgur.com/500Kg.jpg"], {{0, -20}, {0, 0}}],
    "Grayscale"];

Image[
 Transpose[Function[With[{m = Min[#]},
     Map[Function[{v}, If[v == m, 1, 0]], #]]] /@ 
   Transpose[ImageData[img, "Real"]]
  ]
 ]

Tenga en cuenta que recorté un poco el lado derecho de su imagen, ya que allí estaba completamente blanco. El resultado es

Ahora puede unir los puntos o interpolarlos de la manera que desee y obtendrá su EEG

halirután
fuente
@Patrick: ¡Me gusta la idea!
Jonas
Tenga en cuenta que esto solo funcionará si las líneas de la cuadrícula son rectas y paralelas a los ejes de la imagen
endolito el
@endolith, lo has probado, ¿verdad? Porque aquí, funciona cuando la imagen no está alineada exactamente. Por cierto, cuando las líneas de la cuadrícula no son horizontales / verticales, todo el procedimiento para eliminarlas es completamente inútil, ya que para una imagen rotada obtendría valores {x, y} incorrectos para el EEG.
halirutan
@Patrick: quiero decir que no obtendrías los valores x, y correctos si los datos no están alineados con las coordenadas de los píxeles.
endolito el
@Patrick su algo funcionó :) y he extraído la señal con éxito pero todavía tengo dificultades para interpolar la señal (ya que soy muy nuevo en el procesamiento de imágenes), ¿me ayudarán amablemente a interpolar la señal? gracias de nuevo :)
Deepak
5

Tiene una imagen en color donde las líneas de la cuadrícula son rojas y la traza es negra. ¡así que simplemente ignore cualquier píxel que sea rojo!

Si no puede estar seguro de que la imagen está exactamente alineada, puede usar las líneas de la cuadrícula para calcular un sesgo (simplemente la pendiente de la imagen en píxeles / píxel a medida que avanza hacia la derecha).

Luego, convertir la traza negra en un valor 1d es simple. Comience en la primera columna en el borde izquierdo y encuentre el píxel negro (o centroide de un pequeño grupo conectado de píxeles): la posición vertical es su valor.
Haga eso para cada columna de la imagen.
Cuando le falte un valor, deberá interpolar entre los valores conocidos antes y después.

Para obtener puntos adicionales, puede establecer un límite sobre cuánto puede cambiar la traza de columna a columna para permitirle detectar puntos aleatorios o picos de ruido.

Martin Beckett
fuente