一组图像中每个像素的中位数

时间:2018-03-01 21:21:48

标签: image matlab image-processing video median

我想计算一组图像或“视频”中每个像素的中位数。但是,当MATLAB开始计算时,它需要很长时间并随机完成索引错误。为什么呢?

这是代码:

V = VideoReader('hall_monitor.avi');

info = get(V);

M = info.Width;  
N = info.Height;  

nb_frames_bk = 5;

v_pixel = zeros([nb_frames_bk 3]);

IB=zeros([M N 3],'double');

for i=1:M
    for j=1:N          
        for k=1:nb_frames_bk
             frm=read(V,k);
             v_pixel(k,:)=frm(i,j,:);
        end
      IB(i,j,:)=median(v_pixel(:,:));
    end
end


IB=uint8(IB);

imshow(IB);

1 个答案:

答案 0 :(得分:3)

此代码可以从大量重构中受益。首先,当您只需阅读一次,存储它们并在完成后使用它们时,您就重读帧。

其次,迭代所有像素来计算你的中位数将会非常缓慢。从您的代码中看起来,对于第一个nb_frames_bk帧上的每个空间位置,您可以收集这些帧中的所有RGB值并计算RGB的中值。

另外,作为次要注释,由于您将输出矩阵定义错误,因此尺寸超出错误。您将其定义为M x NM宽度N高度。这需要交换。请记住,矩阵首先定义为高度宽度秒。但是,对于我正在建议的正确实施这一点,这是不必要的。

不要一次只读取一个帧,而是指定范围的帧。这样,您将获得一个4D矩阵,其中前三个维度引用图像,第四个维度表示帧编号。然后,您可以获取第四维中的中位数,以查找所有帧的中位RGB值。

换句话说,只需这样做:

V = VideoReader('hall_monitor.avi');

nb_frames_bk = 5;

frms = read(V, [1 nb_frames_bk]);
IB = median(frms, 4);

imshow(IB);

这样做要好得多,并保证更快。您也不需要获取每个帧的宽度和高度,因为我们不再需要在每个像素上循环。