Як відновити сигнал із ЕКГ-зображення


14

У своєму проекті я повинен оцифрувати ЕКГ-зображення, зроблене звичайною камерою (jpeg). Наприклад, у мене є таке захоплене фотоапаратом зображення:

До цього

і я хочу отримати щось подібне: -

Після

а потім оцифровані дані (x, y бали), як у цьому відео про оцифрування ЕКГ

Я поняття не маю, як це зробити, тому я шукав і консультувався з кількома науково-дослідними роботами. Загальний підхід алгоритмів виглядає так:

  1. перехід на зображення сірого рівня
  2. видалити лінії електромережі
  3. додати пропущені бали
  4. конвертувати 2D зображення в 1D зображення

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

Чи можете ви, будь ласка, вказувати мені, як це зробити (я використовую MATLAB 2010)? Будь-яка допомога буде вдячна.


Я запитав в основному те саме, що тут: stackoverflow.com/q/1657941/125507
endolith

@ Deepak, схоже, ви реалізували частину кодексу
matlab

Відповіді:


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

Зауважте, що я обрізав трохи правого боку вашого зображення, оскільки він там був абсолютно білий. Результат -

Тепер ви можете приєднатись до балів або інтерполювати їх усіма способами, які вам подобаються, і ви отримуєте ЕЕГ


@Patrick: Мені подобається ідея!
Йонас

Зауважте, що це спрацює лише в тому випадку, якщо лінії електроліній будуть прямими та паралельними осям зображення
ендоліт

@endolith, ти спробував це, правда ?? Тому що тут він працює, коли зображення точно не вирівняне. До речі, коли лінії електромережі не є горизонтальними / вертикальними, то вся процедура їх видалення є абсолютно марною, оскільки для поверненого зображення ви отримаєте неправильні значення {x, y} для ЕЕГ.
халірутан

@Patrick: Я маю на увазі, що ви б не отримали правильних значень x, y, якщо дані не вирівняні з координатами пікселів.
ендоліт

@Patrick ваш algo працював :), і я успішно видобув сигнал, але все ще маю труднощів з інтерполяцією сигналу (оскільки я дуже новачок в обробці зображень), ласкаво допоможіть мені, як інтерполювати сигнал? ще раз дякую :)
Діпак

5

У вас є кольорове зображення, де лінії лінії червоні, а слід - чорний. тому просто ігноруйте червоні пікселі!

Якщо ви не можете бути впевнені, що зображення точно вирівняне, ви можете використовувати лінії сітки для обчислення перекосу (просто нахил зображення в пікселях / пікселях, якщо ви йдете вправо).

Потім перетворити чорний слід у значення 1d просто. Почніть з першого стовпця з лівого краю та знайдіть чорний піксель (або центроїд невеликої підключеної групи пікселів) - вертикальне положення - це ваше значення.
Зробіть це для кожного стовпця на зображенні.
Якщо у вас відсутнє значення, вам потрібно буде інтерполювати між відомими значеннями до і після.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.