Видеообработка сердцебиения в Matlab. код дополнен

Я пытаюсь написать код, который помогает мне в моей работе по биологии. Концепция кода заключается в анализе видеофайла сокращающихся клеток в ткани.

Пример 1

Пример 2: youtube.com/watch?v=uG_WOdGw6Rk

И начертите следующее:

  1. Количество ударов в мин.
  2. Сила удара
  3. Регулярность избиения

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

Пример результатов моего кода введите здесь описание изображения

Ядро текущего кода, который я написал:

for i=2:totalframes
        compared=read(vidObj,i);
        ref=rgb2gray(compared);%% convert to gray
        level=graythresh(ref);%% calculate threshold
        compared=im2bw(compared,level);%% convert to binary        
        differ=sum(sum(imabsdiff(vid,compared))); %% get sum of difference between 2 frames
        if (differ ~=0) && (any(amp==differ)==0) %%0 is = no change happened so i dont wana record that !
            amp(end+1)=differ;  % save difference to array amp wi
            time(end+1)=i/framerate; %save to time array with sec's, used another array so i can filter both later.
            vid=compared; %% save current frame as refrence to compare the next frame against.
        end
end
figure,plot(amp,time);

=====================

Итак, это мой код, но есть ли способ улучшить его, чтобы получить лучшие результаты?

потому что я чувствую, что imabdiff - это не совсем то, что мне следует использовать, потому что мое видео содержит много шума, и это сильно влияет на мои результаты, и я думаю, что все данные моего усилителя на самом деле подделаны!

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

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


person Zalaboza    schedule 06.02.2012    source источник
comment
Примечание: пример с YouTube — это просто небольшая часть исходного видео, обрезанная из соображений размера!   -  person Zalaboza    schedule 06.02.2012
comment
Не могли бы вы уточнить, как вы хотите улучшить свои результаты? Похоже, ваши результаты показывают очень четкие пики. Как бы вы хотели их улучшить?   -  person Matt    schedule 14.02.2012


Ответы (3)


Вы говорите, что пытаетесь написать «простой код», но на самом деле это не простая проблема. Если вы хотите точно измерить движение, вам следует использовать алгоритм оптического потока или посмотреть на поле деформации из алгоритма регистрации .

РЕДАКТИРОВАТЬ: Как говорит Мэтт, и как мы видим из вашей кривой, ваш метод подходит для извлечения количества ударов и регулярности. Однако, чтобы точно определить силу ударов, вам необходимо рассчитать движение клеток (больше движения = сильнее удар). К сожалению, это не так просто, и поэтому я дал вам ссылки на два алгоритма, которые могут рассчитать движение за вас.

person Ghaul    schedule 07.02.2012
comment
какие указатели? Можете ли вы объяснить больше о технике, которой я должен следовать? - person Zalaboza; 10.02.2012

Несколько довольно простых вещей, которые можно попробовать, которые могут помочь:

  • Я бы подробно рассмотрел, что делает ваше пороговое значение, и действительно ли это то, что вы хотите сделать. Я не знаю, что именно делает greythresh, но, возможно, он объединяет разные функции, которые вы хотели бы различать, в одни и те же значения пикселей. Вы пытались построить различия между изображениями без пороговой обработки? Или вы можете выбрать несколько классов, а не только черный и белый.
  • Если шум является основной проблемой, вы можете попробовать сгладить изображения, прежде чем снимать разницу, чтобы различия в шуме были сглажены, но различия в крупных элементах, вызванные движением, все еще сохранялись.
  • Вы можете попробовать определить края ваших изображений, прежде чем принимать разницу.

Как упоминал предыдущий ответчик, вы также можете изучить алгоритмы отслеживания движения и регистрации, которые будут оценивать фактическое движение между каждым изображением, а не просто сообщать вам, отличаются ли изображения или нет. Я думаю, что это достойное резюме в Википедии: http://en.wikipedia.org/wiki/Video_tracking. Но они могут быть довольно сложными.

Я думаю, что если все, что вам нужно, это найти время и период сокращений, то вам не обязательно нужно будет выполнять подробное отслеживание движения или деформируемую регистрацию между изображениями. Все, что вам нужно знать, это когда они значительно меняются. («Сила» сокращения — это другой вопрос, для точного определения которого вам, вероятно, потребуется знать фактическое происходящее движение.)

person Matt    schedule 10.02.2012

Какие структуры мы видим на видео? Например, что это за большой темный объект в нижней части изображения? Этот объект было бы относительно легко отслеживать, но будут ли данные этого объекта иметь отношение к получению данных о сокращении клеток?

Это изображение из светового микроскопа? При каком увеличении? Каков масштаб? Из видео видно, что есть несколько движений и областей движения. Итак, вы должны сосредоточиться на меньшей или большей области, чтобы получить ваши измерения? Сокращение на клетку или сокращение региона? По опыту я знаю, что изменение того, что вы делаете с микроскопом, может быть намного лучше, чем сложная обработка изображений;)

У меня был успех с Gunn и Nixons Dual Snake для решения аналогичной проблемы: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.64.6831

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

@Matt предложил сглаживание и обнаружение краев, чтобы улучшить ваши результаты. Это хороший совет. Вы можете комбинировать сглаживание, пороговое значение и обнаружение краев в одном вызове функции, детектора краев Канни. Затем вы можете настраивать края, чтобы получить большее перекрытие между кадрами. Небольшое перекрытие, вероятно, будет означать большое движение между кадрами. Вы можете использовать это так же, как и раньше, чтобы найти ритм. Теперь вы можете сделать второй проход и добавить все изображения набранных краев, относящиеся к одному такту. Это должно дать вам представление об области, прочерченной клетками, когда они двигаются через сокращение. Возможно, это можно использовать как полезную меру для сокращения большого скопления клеток.

Сейчас у меня нет доступа к Matlab и Image Processing Toolbox, поэтому я не могу предоставить вам проверенный код. Вот несколько советов: http://www.mathworks.se/help/toolbox/images/ref/edge.html, http://www.mathworks.se/help/toolbox/images/ref/imdilate.html и http ://www.mathworks.se/help/toolbox/images/ref/imadd.html.

person mfrellum    schedule 12.02.2012
comment
Это пример моих видео, это Cardiac Cells (клетки сердца) на световом микро. 10-кратное увеличение, мне нужен способ анализа сокращения всего листа, я уже могу подсчитать удары, но не могу получить точную оценку силы сокращения :( - person Zalaboza; 13.02.2012