Matlab视频处理心脏跳动。代码补充

时间:2012-02-06 06:31:19

标签: matlab image-processing video-processing motion-detection

我正在尝试编写代码帮助我完成生物学工作。 代码的概念是分析组织中收缩细胞的视频文件

Example 1

示例2:youtube.com/watch?v=uG_WOdGw6Rk

并绘制出以下内容:

  1. 每分钟节拍数。
  2. Beat强度
  3. 殴打的规律性
  4. 所以我写了一个Matlab代码,它会遍历一个视频并比较每个帧与其后的帧,并查看帧中是否有任何变化并在曲线上绘制这些变化。

    我的代码结果示例 enter image description here

    我写的当前代码的核心:

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

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

    这就是我的代码,但有没有办法可以改进它,这样我可以获得更好的结果?

    因为我觉得imabsdiff并不是我应该使用的,因为我的视频包含很多噪音而且影响我的结果很多,而且我认为我的所有放大器数据实际上都是伪造的!

    另外,我实际上只能通过计算峰值来提取跳动率,但是如何改进我的代码以便能够从中获取所有必需的数据?

    非常感谢您的帮助,这是一小部分代码,如果您需要更多信息,请告诉我。 感谢

3 个答案:

答案 0 :(得分:9)

你说你正在尝试编写一个“简单代码”,但这不是一个简单的问题。如果您想准确地测量运动,您应该使用optical flow algorithm或查看registration algorithm.

中的变形字段 编辑:正如马特所说,正如我们从你的曲线中看到的那样,你的方法适合于提取节拍的数量和规律性。然而,为了准确地找到节拍的强度,你需要计算细胞的运动(更多的运动=更强的节拍)。不幸的是,这不是直截了当的,这就是为什么我给你链接到两个可以为你计算运动的算法。

答案 1 :(得分:4)

尝试一些相当简单的事情可能有所帮助:

  • 我会仔细研究你的阈值正在做什么,以及这是否真的是你想要做的。我不知道graythresh究竟做了什么,但它可能会将你想要区分成相同像素值的不同特征混为一谈。您是否尝试过绘制图像之间的差异而不进行阈值处理?或者你可以进入多个班级,而不仅仅是黑人和白人。
  • 如果噪音是主要问题,你可以尝试在拍摄差异之前平滑图像,这样噪音的差异就会平均,但是由运动引起的大特征差异仍会存在。
  • 您可以尝试边缘检测图像,然后再采用差异。

正如前面提到的一个回答者,您还可以研究运动跟踪和配准算法,它们可以估计每个图像之间的实际运动,而不仅仅是告诉您图像是否不同。我认为这是维基百科上的一个不错的总结:http://en.wikipedia.org/wiki/Video_tracking。但它们可能相当复杂。

我认为,如果您只需要找到收缩的时间和周期,那么您不一定需要在图像之间进行详细的运动跟踪或可变形注册。您需要知道的是,当他们发生重大变化时。 (收缩的“强度”是另一个问题,要严格定义你可能需要知道实际运动。)

答案 2 :(得分:4)

我们在视频中看到的结构是什么?例如,图像下部的大黑暗物体是什么?这个对象相对容易跟踪,但是这个对象的数据是否与获取细胞收缩数据有关?

这张图片来自一个光学显微镜吗?在什么放大倍数?规模是多少? 从视频看起来有几个动作和运动区域。那么你应该专注于更小或更大的区域来获得测量结果吗?每个细胞收缩或区域收缩?根据经验,我知道改变你在显微镜上所做的事情可能比复杂的图像处理好得多;)

我和Gunn以及Nixons Dual Snake有过类似的问题: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.64.6831

我手动将第一个aproximation放在第一帧中,并将分割结果用作下一帧的起始曲线,依此类推。我的实现是从2000年开始,我只在纸上写,但如果你发现Gunn和Nixons的论文很有意思,我可以找到我的代码并扫描它。

@Matt建议平滑和边缘检测以改善您的结果。这是一个很好的建议。您可以在一个函数调用Canny边缘检测器中组合平滑,阈值和边缘检测。然后,您可以扩展边缘以获得帧之间更大的重叠。很少重叠可能意味着帧之间的大运动。您可以像以前一样使用它来查找节拍。您现在可以进行第二次传递并添加与一个节拍相关的所有透明边缘图像。这可以让您了解细胞在通过收缩移动时所追踪的区域。也许这可以作为收缩大量细胞群的有用措施。

我现在无法访问Matlab和图像处理工具箱,因此我无法为您提供经过测试的代码。以下是一些提示: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