我想计算一组图像或“视频”中每个像素的中位数。但是,当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);
答案 0 :(得分:3)
此代码可以从大量重构中受益。首先,当您只需阅读一次,存储它们并在完成后使用它们时,您就重读帧。
其次,迭代所有像素来计算你的中位数将会非常缓慢。从您的代码中看起来,对于第一个nb_frames_bk
帧上的每个空间位置,您可以收集这些帧中的所有RGB值并计算RGB的中值。
另外,作为次要注释,由于您将输出矩阵定义错误,因此尺寸超出错误。您将其定义为M x N
,M
为宽度,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);
这样做要好得多,并保证更快。您也不需要获取每个帧的宽度和高度,因为我们不再需要在每个像素上循环。