MATLAB:如果他们花费太多时间,我怎么能避免iamresize和VideoReader?

时间:2016-12-09 07:34:56

标签: matlab mean-shift

我正在对视频帧进行基于移位颜色的图像分割。 这是我的代码:

 while hasFrame(v)
   if k == 1
       s(k).cdata = readFrame(v);
       a = s(k).cdata;
       I = imresize(a,[50,50]); 
       [means, Ims, Nms] = Ms(I,bw); %Mean Shift on first frame
       Ims = im2uint8(Ims);
       s(k).cdata = Ims;
   else
       s(k).cdata = readFrame(v);
       a = s(k).cdata;
       I = imresize(a,[50,50]);
       [Ims,data2cluster]= MeanShiftCluster2(I,means); % simple segmentation based on norm using means of first frame              
       Ims = im2uint8(Ims);
       Ims = imresize(Ims,[500,720]);
       s(k).cdata = Ims;
   end

   k=k+1;
 end

我发送平均移位实现的第一帧,然后对所有其他帧使用相同的结果平均值,根据欧氏距离计算各自的簇(我的帧有微小的变化)。

问题: Profiler告诉iamresize和VideoReader函数执行时间太长。我可以使用任何替代品吗?

1 个答案:

答案 0 :(得分:0)

imresize可能是您处理过程中最慢的一步。 但是这里有几个想法来加快这个过程。

imresize执行所谓的插值。这可能是一个缓慢的过程,但速度取决于您想要的输出质量。 matlab中的默认值为bicubic。您可以尝试bilinearnearest例如

[...] = imresize(...,'nearest');

在我的个人实验中,我也发现imresize作为等效函数有一些开销。你可能会去"很多"通过仅为所有视频帧调用该函数一次更快。你需要有足够的内存才能做到这一点。假设您拥有3d矩阵dataMovie中的所有帧。构造这个矩阵时,预分配(通过获取帧数)将有助于获得一些速度!

k = 0.5; % scaling parameter
tform = affine2d([k 0 0;0 k 0;0 0 1]);
dataTform = imwarp(dataMovie,tform,'nearest');

然后,逐帧应用处理到调整大小的电影。您还可以提供插值类型nearsetlinearbicubic

如果您正在处理彩色电影,则需要将所有帧的3个颜色层叠加在一起,然后使用正确的索引将其取回。