收缩组织的 Matlab 视频处理。如何分析运动?

信息处理 matlab 算法 视频处理
2022-01-31 01:04:30

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

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

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

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

1个回答

您可以在图像序列上尝试一个简单的非线性去噪滤波器(3x3 或 5x5 中值滤波器),以使您的检测对噪声更加鲁棒;但我觉得这些图像上的移动细节或非常薄,过多的过滤会损害您的检测。看起来您已经在比较之前对图像进行了阈值处理,因此这里唯一重要的噪声是在每帧中移动高于和低于阈值的像素。

要获得跳动率,您还可以计算序列的自相关。它将显示跳动率的次要最大值。自相关实际上是您的任务的有趣表示,因为:

  • 非常规律的节拍意味着 AC 序列上非常尖锐的次峰;而更不规则的节拍将在 AC 序列中显示出平坦、分散的次峰。
  • 自相关二次峰与第一峰之比 (r0) 可以作为拍子强度的一个很好的衡量标准。

但回到时域,您也可以考虑:

  • 序列的峰度作为“峰值”(以及节拍强度)的度量。峰值的其他度量包括几何平均值与算术平均值的比率。
  • 峰之间的时间间隔的标准偏差,作为搏动规律性的量度。缺点是您必须检测峰值,这在您的情况下会有点不精确,尤其是考虑到数据的时间分辨率较低(这就是为什么我首先考虑从 AC 函数做事的原因!)