0

所以我的电脑不是太强大..至少可以说..但我想在整个特定电影中创建所有像素的中值。我能够为内存中的一系列帧做到这一点..但我不确定每次阅读更多帧时如何做到这一点......我如何给出中间权重?(就像我每次会读取 100 帧但中值必须根据当前中值 * 100 * 我读取的次数 + 100 * 当前图像进行更新。)我有这个代码:

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

我的问题是,鉴于我将在所有内容之上添加另一个循环,如何给出中值权重?

谢谢!

4

2 回答 2

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

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

于 2013-10-19T10:43:44.787 回答
0

在大量帧的情况下,以渐进方式计算中值可能会出现问题,因为中值是全局顺序统计量并且没有结构。经典方法是利用我们正在处理灰度 8 位值 (256) 的事实。因此,对于任何像素 p(x,y,n),需要维护一个具有 256 个 bin 的直方图,每个 bin 计算 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 是图像的尺寸。

于 2013-11-02T02:19:23.420 回答