Comment récupérer le signal d'une image ECG

14

Dans mon projet, je dois numériser une image ECG prise avec un appareil photo normal (jpeg). Par exemple, j'ai l'image capturée par la caméra suivante:

Avant

et je veux obtenir quelque chose comme ça: -

Après

puis les données numérisées (points x, y), comme dans cette vidéo sur la numérisation de l'ECG

Je ne sais pas comment le faire, j'ai donc cherché et consulté plusieurs articles de recherche. L'approche générale des algorithmes est la suivante: -

  1. passer à l'image du niveau de gris
  2. supprimer le quadrillage
  3. ajouter des points manquants
  4. convertir une image 2D en image 1D

Je suis coincé avec le deuxième point, c'est-à-dire la suppression du quadrillage. J'ai recherché d'autres références pour ce faire et j'ai trouvé que l'analyse de l'histogramme pourrait être utile.

Pouvez-vous me guider sur la façon de procéder (j'utilise MATLAB 2010)? Toute aide serait appréciée.

Deepak
la source
J'ai demandé essentiellement la même chose ici: stackoverflow.com/q/1657941/125507
endolith
@ Deepak, il semble que vous ayez implémenté la partie matlab du code mentionné dans l'article, pouvez-vous partager la partie matlab où vous convertissez l'image numérisée en signal 1D pour l'interpolation
user3278

Réponses:

16

Désolé, j'utilise Mathematica, mais il devrait être vraiment facile d'implémenter l'idée dans Matlab. Je donne quand même le code, donc quand ma description n'est pas assez détaillée, vous pouvez obtenir le reste du code.

L'idée de base est la suivante: vous regardez votre image par colonne. Traitez chaque colonne de pixels séparément. Notez que dans l'intrigue, j'ai inversé les valeurs de gris. Donc, le noir est 1 et le blanc est 0.
Si vous tracez les valeurs (inversées) de luminosité-pixel, vous n'avez fondamentalement que deux situations. Le premier est, lorsque votre colonne n'est pas sur une ligne de grille verticale. L'intrigue ressemble

La deuxième situation est, où vous êtes directement sur une ligne de grille verticale. Ensuite, la ligne de grille influence la luminosité de toute la colonne

Mais ce que vous voyez, c'est que votre EEG sombre semble toujours être le maximum. Par conséquent, l'algorithme très complexe est le suivant: Parcourez chaque colonne et prenez la position du pixel le plus noir.

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"]]
  ]
 ]

Notez que j'ai recadré un peu du côté droit de votre image, car elle était complètement blanche là-bas. Le résultat est

Vous pouvez maintenant joindre les points ou les interpoler comme vous le souhaitez et vous obtenez votre EEG

halirutan
la source
@Patrick: J'aime l'idée!
Jonas
Notez que cela ne fonctionnera que si les lignes de grille sont droites et parallèles aux axes de l'image
endolith
@endolith, vous l'avez essayé, non ?? Parce qu'ici, cela fonctionne lorsque l'image n'est pas exactement alignée. En fait, lorsque les lignes de grille ne sont pas horizontales / verticales, alors toute la procédure de leur suppression est complètement inutile, car pour une image pivotée, vous obtiendriez des valeurs {x, y} erronées pour l'EEG.
halirutan
@Patrick: Je veux dire que vous n'obtiendrez pas les bonnes valeurs x, y si les données ne sont pas alignées avec les coordonnées des pixels.
endolith
@Patrick, votre algo a fonctionné :) et j'ai réussi à extraire le signal, mais j'ai toujours des difficultés à interpoler le signal (car je suis très nouveau dans le traitement d'image), veuillez m'aider à interpoler le signal? merci encore :)
Deepak
5

Vous avez une image en couleur où le quadrillage est rouge et la trace est noire. alors ignorez simplement les pixels rouges!

Si vous ne pouvez pas être sûr que l'image est exactement alignée, vous pouvez utiliser les lignes de la grille pour calculer un biais (simplement la pente de l'image en pixels / pixel lorsque vous allez à droite).

Transformer ensuite la trace noire en valeur 1d est simple. Commencez dans la première colonne sur le bord gauche et trouvez le pixel noir (ou le centroïde d'un petit groupe de pixels connectés) - la position verticale est votre valeur.
Faites cela pour chaque colonne de l'image.
Lorsque vous avez une valeur manquante, vous devrez interpoler entre les valeurs connues avant et après.

Pour des points supplémentaires, vous pouvez définir une limite sur la façon dont la trace peut changer d'une colonne à l'autre pour vous permettre de repérer des points aléatoires ou des pics de bruit.

Martin Beckett
la source