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

问题描述 投票:1回答:1

我想计算一组图像或“视频”中每个像素的中位数。但是,当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);
image matlab image-processing video median
1个回答
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);

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

© www.soinside.com 2019 - 2024. All rights reserved.