Как восстановить сигнал с изображения ЭКГ

14

В моем проекте я должен оцифровать изображение ЭКГ, полученное с помощью обычной камеры (JPEG). Например, у меня есть следующее изображение с камеры:

Перед

и я хочу получить что-то вроде этого:

После

а затем оцифрованные данные (х, у точек), как в этом видео о оцифровке ЭКГ

Я понятия не имею, как это сделать, поэтому я искал и консультировался с несколькими исследовательскими работами. Общий подход алгоритмов выглядит так:

  1. изменить на изображение уровня серого
  2. удалить линии сетки
  3. добавить недостающие точки
  4. конвертировать 2D изображение в 1D изображение

Я застрял со вторым пунктом, т.е. удаление линий сетки. Я нашел еще несколько ссылок, чтобы сделать это, и обнаружил, что анализ гистограммы может быть полезным.

Подскажите, пожалуйста, как мне это сделать (я использую MATLAB 2010)? Любая помощь будет оценена.

Дипак
источник
Я спросил в основном то же самое здесь: stackoverflow.com/q/1657941/125507
эндолит
@ Deepak, похоже, что вы реализовали часть кода Matlab, упомянутую в посте, можете ли вы поделиться частью Matlab, где вы конвертируете отсканированное изображение в 1D-сигнал для интерполяции
user3278

Ответы:

16

Извините, я использую Mathematica, но реализовать эту идею в Matlab должно быть действительно легко. Я даю код в любом случае, поэтому, когда мое описание недостаточно подробное, вы можете получить остальное из кода.

Основная идея такова: вы смотрите на свое изображение по столбцам. Обработайте каждый столбец пикселей отдельно. Обратите внимание, что на графике я инвертировал значения серого. Таким образом, черный цвет равен 1, а белый равен 0.
Если вы строите (инвертированные) значения яркости в пикселях, у вас есть только две ситуации. Первый, когда ваш столбец не находится на вертикальной линии сетки. Сюжет выглядит так

Вторая ситуация, когда вы находитесь прямо на вертикальной линии сетки. Тогда линия сетки влияет на яркость всего столбца

Но вы видите, что ваша темная ЭЭГ, кажется, всегда максимальна. Поэтому очень сложный алгоритм таков: пройти через каждый столбец и занять позицию самого черного пикселя.

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

Обратите внимание, что я обрезал немного правой стороны вашего изображения, так как оно было полностью белым. Результат

Теперь вы можете присоединиться к точкам или интерполировать их любым удобным для вас способом, и вы получите свою ЭЭГ

halirutan
источник
@ Патрик: мне нравится идея!
Джонас
Обратите внимание, что это будет работать, только если линии сетки будут прямыми и параллельными осям изображения
эндолит
@endolith, ты пробовал, верно? Потому что здесь это работает, когда изображение не точно выровнено. Кстати, когда линии сетки не горизонтальны / вертикальны, тогда вся процедура их удаления совершенно бесполезна, так как для повернутого изображения вы получите неправильные значения {x, y} для ЭЭГ.
Халирутан
@ Патрик: Я имею в виду, что вы не получите правильные значения x, y, если данные не выровнены с координатами пикселей.
эндолит
@ Патрик, ваш алгоритм работал :), и я успешно извлек сигнал, но все еще испытываю некоторые трудности с интерполяцией сигнала (так как я очень плохо знаком с обработкой изображений), пожалуйста, помогите мне, как интерполировать сигнал? еще раз спасибо :)
Дипак
5

У вас есть цветное изображение, где линии сетки красные, а трасса черная. так что просто игнорируйте любые пиксели, которые красные!

Если вы не можете быть уверены, что изображение точно выровнено, вы можете использовать линии сетки для вычисления перекоса (просто наклон изображения в пикселях на пиксель при движении вправо).

Затем превратить черный след в значение 1d просто. Начните в первом столбце с левого края и найдите черный пиксель (или центроид небольшой связанной группы пикселей) - вертикальное положение - это ваше значение.
Сделайте это для каждого столбца в изображении.
Там, где у вас есть пропущенное значение, вам нужно будет интерполировать между известными значениями до и после.

Для дополнительных точек вы можете установить предел того, насколько трасса может меняться от столбца столбец, чтобы вы могли обнаружить случайные точки или пики шума.

Мартин Беккет
источник