【问题标题】:Matlab video processing of heart beating. code supplementedMatlab对心跳的视频处理。代码补充
【发布时间】:2012-02-27 16:59:16
【问题描述】:

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

Example 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 数据实际上都是伪造的!

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

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

【问题讨论】:

  • 注意:youtube 示例只是原始视频的一小部分,为了大小!
  • 您能否更具体地说明您希望您的结果如何变得更好?看起来您的结果显示了非常清晰的峰值。您希望如何改进它们?

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


【解决方案1】:

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

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

【讨论】:

  • 什么指针?你能解释一下我应该遵循的技术吗?
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

    我曾与 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。

    【讨论】:

    • 这些是我的视频的一个例子,这些是光显微上的心脏细胞(心脏细胞)。 10X 放大倍率,我需要一种方法来分析整张纸的收缩情况,我已经可以计算节拍但无法准确估计收缩强度:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    相关资源
    最近更新 更多