Jak odzyskać sygnał z obrazu EKG

14

W moim projekcie muszę zdigitalizować zdjęcie EKG zrobione zwykłym aparatem (JPEG). Na przykład mam zarejestrowany następujący aparat:

Przed

i chcę dostać coś takiego: -

Po

a następnie zdigitalizowane dane (punkty x, y), jak w tym filmie na temat digitalizacji EKG

Nie mam pojęcia, jak to zrobić, więc przeszukałem i zapoznałem się z kilkoma artykułami badawczymi. Ogólne podejście algorytmów jest następujące:

  1. zmień na obraz w poziomie szarości
  2. usuń linie siatki
  3. dodaj brakujące punkty
  4. przekonwertować obraz 2D na obraz 1D

Utknąłem z drugim punktem, tj. Usunięciem linii siatki. Poszukałem więcej referencji, aby to zrobić, i odkryłem, że analiza histogramu może być pomocna.

Czy możesz mi pomóc, jak to zrobić (używam MATLAB 2010)? Każda pomoc będzie mile widziana.

Deepak
źródło
Zasadniczo zapytałem tutaj o to samo: stackoverflow.com/q/1657941/125507
endolith
@ Deepak, wygląda na to, że zaimplementowałeś część Matlaba w kodzie wymienionym w poście, czy możesz uprzejmie udostępnić część Matlab, w której konwertujesz zeskanowany obraz na sygnał 1D do interpolacji
3278

Odpowiedzi:

16

Przepraszam, używam Mathematiki, ale implementacja pomysłu w Matlabie powinna być naprawdę łatwa. W każdym razie podaję kod, więc kiedy mój opis nie jest wystarczająco szczegółowy, resztę możesz uzyskać z kodu.

Podstawowa idea jest taka: patrzysz na obraz kolumnowo. Przetwarzaj każdą kolumnę pikseli osobno. Zauważ, że na wykresie odwróciłem szare wartości. Tak więc czerń ma wartość 1, a biel wynosi 0.
Jeśli wydrukujesz (odwrócone) wartości jasności-pikseli, w zasadzie masz tylko dwie sytuacje. Po pierwsze, gdy kolumna nie znajduje się na pionowej linii siatki. Fabuła wygląda

Druga sytuacja polega na tym, że jesteś bezpośrednio na pionowej linii siatki. Następnie linia siatki wpływa na jasność całej kolumny

Ale widzisz, że twój ciemny EEG wydaje się zawsze maksymalny. Dlatego bardzo złożonym algorytmem jest: Przejdź przez każdą kolumnę i przyjmij pozycję najbardziej czarnego piksela.

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

Zauważ, że przyciąłem trochę prawej strony twojego obrazu, ponieważ był tam całkowicie biały. Wynik to

Teraz możesz dołączyć do punktów lub interpolować je w dowolny sposób, a otrzymasz swój EEG

halirutan
źródło
@Patrick: Podoba mi się pomysł!
Jonas
Zauważ, że zadziała to tylko wtedy, gdy linie siatki są proste i równoległe do osi obrazu
endolith
@endolith, próbowałeś, prawda? Ponieważ tutaj działa, gdy obraz nie jest dokładnie wyrównany. Przy okazji, gdy linie siatki nie są poziome / pionowe, wówczas cała procedura ich usuwania jest całkowicie bezużyteczna, ponieważ dla obróconego obrazu można by pomylić wartości {x, y} dla EEG.
halirutan
@Patrick: Mam na myśli, że nie uzyskałbyś poprawnych wartości x, y, jeśli dane nie są wyrównane ze współrzędnymi pikseli.
endolith
@Patrick Twój algo zadziałał :) i udało mi się wyodrębnić sygnał, ale nadal mam pewne trudności z interpolacją sygnału (ponieważ jestem bardzo nowy w przetwarzaniu obrazu), uprzejmie pomóż mi w tym, jak interpolować sygnał? dzięki jeszcze raz :)
Deepak,
5

Masz kolorowy obraz, w którym linie siatki są czerwone, a ślad jest czarny. więc po prostu zignoruj ​​wszystkie czerwone piksele!

Jeśli nie masz pewności, czy obraz jest dokładnie wyrównany, możesz użyć linii siatki do obliczenia pochylenia (po prostu nachylenie obrazu w pikselach / piksel w prawo).

Następnie przekształcenie czarnego śladu w wartość 1d jest proste. Zacznij od pierwszej kolumny przy lewej krawędzi i znajdź czarny piksel (lub centroid małej, połączonej grupy pikseli) - pozycja pionowa to twoja wartość.
Zrób to dla każdej kolumny na obrazie.
W przypadku braku wartości konieczne będzie interpolowanie znanych wartości przed i po.

Aby uzyskać dodatkowe punkty, możesz ustawić limit zmiany śladu między kolumnami, aby umożliwić wykrycie przypadkowych kropek lub skoków hałasu.

Martin Beckett
źródło