2013-10-19 22 views
0

所以我的电脑不是太强..至少可以说.. 但是我想创建一个整个特定电影中所有像素的中位数。 我能够做到这一点在内存中的帧序列..但我不知道如何做到这一点,当每次阅读更多的帧...我怎么给中值体重? (如我将读取的每个时间100帧,但中值具有根据当前正中* 100 *次予读+ 100 *当前图像..更新) 我有这样的代码:Matlab在整个电影上创建中位数(避免内存问题)

mov = VideoReader('MVI_3478.MOV'); 
seq = read(mov, [1 frames]); 
% create background 
channels = size(seq, 3); 
height = size(seq,1); 
width = size(seq,2); 
BG = zeros(height, width, channels, 'uint8'); 
for c = 1:channels 
    for y = 1:height 
     for x = 1:width 
      BG(y,x,c) = median(seq(y,x,c,:)); 
     end 
    end 
end 

和我的问题是,鉴于我会在一切之上添加另一个循环,如何给予中等体重?

谢谢!

回答

0

这种方法没有可能计算中位数。所需的信息将丢失。

实施例:

median([1,2,3,4,5,6,7]) is 4 
median([1,2,3,3,5,6,7]) is 3 
median([1,2,3])=2 
median([4,5,6,7])=5 
median([3,5,6,7])=5 

因此,对于子序列你得到的部分结果2和5,而中位数为3,在其他情况下,一个壳体和4。

我看到的唯一的可能就是一些二进制搜索方法:

smaller=0 
larger=0 
equal=0 
el=numel(s) 
while(smaller>=el/2||larger>el/2||equal==0) 
    guess=.. 
    smaller=0 
    larger=0 
    equal=0 
    for c = 1:channels 
     for y = 1:height 
      for x = 1:width 
       s=seq(y,x,c,:) 
       smaller=smaller+numel(s(s<guess); 
       larger=larger+numel(s(s>guess); 
       equal=equal+numel(s(s=guess); 
      end 
     end 
    end 
end 

这只是一个草图,代码完成。猜测必须填充一些二进制搜索策略。

0

在大量帧的情况下,以渐进方式计算中值可能是问题,因为中值是全局顺序统计量并且不具有结构。传统方法是使用我们使用灰度8位值(256)的事实。因此,对于任何像素p(x,y,n),需要维持具有256个分箱的直方图,每个分箱计算n个值(因为存在n个帧)。

因此,在每次更新,我们将有:

value = p(x,y,i); %for the ith frame 
H(x,y,value) = H(x,y,value) + 1; %updating your histogram, 

,然后排序它们的频率直方图,并选择中间值:https://math.stackexchange.com/questions/202302/how-to-calculate-median-and-standard-deviation-from-histogram

此计数器的大小可以决定,基于数你在视频中有N = log2(n)位的帧。由于在直方图中进行恒定时间搜索,所以现在的中值搜索被简化了。这也有助于连接许多直方图,因为搜索保持独立的时间搜索。 因此,最终您的直方图的总大小将为X Y N位,其中X和Y是图像的尺寸。