7

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

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

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

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

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

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

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

4

3 回答 3

9

您说您正在尝试编写“简单代码”,但这并不是一个真正简单的问题。如果要准确测量运动,则应使用光流算法或从配准算法中查看变形场。

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

于 2012-02-07T10:18:32.720 回答
4

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

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

我与 Gunn 和 Nixons Dual Snake 一起解决了类似的问题: http ://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.64.6831

我手动将第一个近似值放在第一帧中,并将分割结果用作下一帧的起始曲线,依此类推。我的实现是从 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。

于 2012-02-12T19:02:15.930 回答
4

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

  • 我会详细了解您的阈值在做什么,以及这是否真的是您想要做的。我不知道 graythresh 究竟做了什么,但它可能会将您想要区分的不同特征集中到相同的像素值中。您是否尝试过在没有阈值的情况下绘制图像之间的差异?或者您可以划分为多个类别,而不仅仅是黑白。
  • 如果噪声是主要问题,您可以在获取差异之前尝试对图像进行平滑处理,以便消除噪声差异,但由运动引起的大特征差异仍然存在。
  • 您可以在获取差异之前尝试对图像进行边缘检测。

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

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

于 2012-02-10T17:38:01.993 回答