Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Matlab video processing of heart beating. code supplemented

I'm trying to write a code The helps me in my biology work. Concept of code is to analyze a video file of contracting cells in a tissue

Example 1

Example 2: youtube.com/watch?v=uG_WOdGw6Rk

And plot out the following:

  1. Count of beats per min.
  2. Strenght of Beat
  3. Regularity of beating

And so i wrote a Matlab code that would loop through a video and compare each frame vs the one that follow it, and see if there was any changes in frames and plot these changes on a curve.

Example of My code Results enter image description here

Core of Current code i wrote:

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);

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

So thats my code, but is there a way i can improve it so i can get better results ?

because i get fealing that imabsdiff is not exactly what i should use because my video contain alot of noise and that affect my results alot, and i think all my amp data is actually faked !

Also i actually can only extract beating rate out of this, by counting peaks, but how can i improve my code to be able to get all required data out of it ??

thanks also really appreciate your help, this is a small portion of code, if u need more info please let me know. thanks

like image 779
Zalaboza Avatar asked Feb 06 '12 06:02

Zalaboza


1 Answers

You say you are trying to write a "simple code", but this is not really a simple problem. If you want to measure the motion accuratly, you should use an optical flow algorithm or look at the deformation field from a registration algorithm.

EDIT: As Matt is saying, and as we see from your curve, your method is suitable for extracting the number of beats and the regularity. To accuratly find the strength of the beats however, you need to calculate the movement of the cells (more movement = stronger beat). Unfortuantly, this is not straight forwards, and that is why I gave you links to two algorithms that can calculate the movement for you.

like image 104
Ghaul Avatar answered Sep 28 '22 10:09

Ghaul