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

7
我正在尝试编写一段代码,以帮助我在生物学工作中进行分析。代码的概念是分析组织中收缩细胞的视频文件。 示例1 示例2: youtube.com/watch?v=uG_WOdGw6Rk
并绘制以下内容:
  1. 每分钟心跳次数。
  2. 心跳强度。
  3. 心跳规律性。
因此,我编写了一个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并不是我应该使用的,因为我的视频包含很多噪声,这对我的结果影响很大,而且我认为所有的amp数据实际上都是假的!
此外,我只能通过计算峰值来提取心率,但我如何改进我的代码以能够获取所有所需的数据?
感谢您的帮助,这是一个小部分的代码,如果您需要更多信息,请告诉我。谢谢

注意:YouTube示例只是原始视频的裁剪小部分,为了大小而进行了裁剪! - Zalaboza
你能更具体地说明你想让结果变得更好的方式吗?看起来你的结果显示出非常明显的峰值。你想如何改进它们呢? - Matt
3个回答

9
您说您想编写一个“简单的代码”,但这并不是一个真正简单的问题。如果您想要准确测量运动,您应该使用光流算法或查看来自注册算法的变形场。

编辑:正如Matt所说,并且从您的曲线中可以看出,您的方法适用于提取心跳次数和规律性。但是,为了准确找到心跳力度,您需要计算细胞的运动(更多的运动=更强的心跳)。不幸的是,这并不是直截了当的,这就是为什么我给您提供两个算法的链接,可以为您计算运动。


指针是什么?你能详细解释一下我应该遵循的技术吗? - Zalaboza

4
有几个相对简单的方法可尝试,可能有所帮助:
  • 我建议您详细查看阈值处理的过程,并确保这确实是您需要的。我不知道graythresh的具体作用,但可能会将您想要区分的不同特征合并到相同的像素值中。您尝试过在没有阈值处理的情况下绘制图像差异吗?或者您可以将图像阈值处理成多个类别,而不仅仅是黑色和白色。
  • 如果噪声是主要问题,您可以尝试在取差之前对图像进行平滑处理,以便使噪声中的差异均匀化,但由运动引起的大型特征差异仍然存在。
  • 在取差之前,您可以尝试对图像进行边缘检测。

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

我认为,如果您只需要找到收缩的时间和周期,那么您可能不需要对图像进行详细的运动跟踪或可变形配准。您只需要知道何时它们有显著的变化即可。(定义收缩的“强度”是另一个问题,要严格定义它,您可能需要知道实际发生的运动。)


4
这个视频中我们看到的结构是什么?例如,图像下部的大黑色物体是什么?这个对象相对容易跟踪,但是从这个对象获取的数据是否与细胞收缩的数据相关?
这个图像来自光学显微镜吗?放大倍数是多少?比例尺是多少? 从视频中看来,有几种运动和运动区域。那么,为了得到测量数据,应该关注更小还是更大的区域?是细胞收缩还是区域收缩?根据我的经验,改变在显微镜上所做的事情可能比复杂的图像处理要好得多 ;)
我用Gunn和Nixon的双蛇算法成功解决了类似的问题: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.64.6831 我手动将第一个近似值放在第一个帧中,并将分割结果用作下一个帧的起始曲线,以此类推。我的实现是2000年的,只有纸质版,但是如果你觉得Gunn和Nixon的论文很有意思,我可以找到我的代码并扫描。
@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。

这些是我的视频示例,展示了亮场显微镜下心脏细胞的收缩。放大10倍。我需要一种分析整个细胞表面收缩的方法,已经可以统计心跳次数,但无法准确估算收缩强度 :( - Zalaboza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接