Como recupero o sinal de uma imagem de ECG


14

No meu projeto, preciso digitalizar uma imagem de ECG tirada com uma câmera normal (jpeg). Por exemplo, tenho a seguinte imagem capturada da câmera:

Antes

e eu quero algo assim: -

Depois de

e então os dados digitalizados (pontos x, y), como neste vídeo sobre digitalização do ECG

Não tenho idéia de como fazê-lo, então procurei e consultei vários trabalhos de pesquisa. A abordagem geral dos algoritmos é como:

  1. mudar para a imagem no nível de cinza
  2. excluir linhas de grade
  3. adicionar pontos ausentes
  4. converter imagem 2D para imagem 1D

Estou preso ao segundo ponto, ou seja, excluindo as linhas de grade. Procurei mais algumas referências para fazer isso e achei que a análise de histograma pode ser útil.

Você pode me orientar sobre como fazer isso (estou usando o MATLAB 2010)? Qualquer ajuda seria apreciada.


Eu perguntei basicamente a mesma coisa aqui: stackoverflow.com/q/1657941/125507
endolith

@ Deepak, parece que você implementou a parte Matlab do código mencionado no post, você pode gentilmente compartilhar a parte Matlab onde você está convertendo a imagem digitalizada para sinal 1D para interpolação
user3278

Respostas:


16

Desculpe, eu uso o Mathematica, mas deve ser muito fácil implementar a ideia no Matlab. Eu dou o código de qualquer maneira, portanto, quando minha descrição não for detalhada o suficiente, você poderá obter o restante do código.

A idéia básica é: você olha sua imagem em colunas. Processe todas as colunas de pixels separadamente. Observe que no gráfico inverti os valores de cinza. Portanto, preto é 1 e branco é 0.
Se você plotar os valores de pixel de brilho (invertidos), terá basicamente apenas duas situações. O primeiro é quando sua coluna não está em uma linha de grade vertical. O enredo parece

A segunda situação é onde você está diretamente em uma linha de grade vertical. Então a linha de grade influencia o brilho de toda a coluna

Mas o que você vê é que seu EEG escuro parece ser sempre o máximo. Portanto, o algoritmo muito complexo é: Percorra todas as colunas e tome a posição do pixel mais preto.

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

Note que eu cortei um pouco do lado direito da sua imagem, uma vez que era completamente branco lá. O resultado é

Agora você pode juntar-se aos pontos ou interpolar-os da maneira que quiser e você obtém seu EEG


@ Patrick: Eu gosto da ideia!
Jonas

Observe que isso só funcionará se as linhas de grade forem retas e paralelas aos eixos da imagem
endolito

@ Endolith, você já tentou, certo? Porque aqui, ele funciona quando a imagem não está exatamente alinhada. Aliás, quando as linhas de grade não são horizontais / verticais, todo o procedimento para removê-las é completamente inútil, pois para uma imagem rotacionada você obteria valores {x, y} errados para o EEG.
halirutan

@ Patrick: Quero dizer que você não obteria os valores x, y corretos se os dados não estiverem alinhados com as coordenadas dos pixels.
Endolith

@ Patrick seu algo funcionou :) e eu extraí com sucesso o sinal, mas ainda tenho alguma dificuldade em interpolar o sinal (como eu sou muito novo no processamento de imagens), por favor me ajude em como interpolar o sinal? obrigado novamente :)
Deepak

5

Você tem uma imagem colorida em que as linhas de grade são vermelhas e o traço é preto. simplesmente ignore os pixels vermelhos!

Se você não tiver certeza de que a imagem está exatamente alinhada, poderá usar as linhas de grade para calcular uma inclinação (simplesmente a inclinação da imagem em pixels / pixel à medida que você for para a direita).

Então, transformar o traço preto em um valor 1d é simples. Comece na primeira coluna na borda esquerda e encontre o pixel preto (ou centróide de um pequeno grupo de pixels conectado) - a posição vertical é o seu valor.
Faça isso para cada coluna na imagem.
Onde você tem um valor ausente, precisará interpolar entre os valores conhecidos antes e depois.

Para pontos extras, você pode definir um limite de quanto o traço pode mudar de coluna para coluna, para permitir que você encontre pontos aleatórios ou picos de ruído.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.