一组图像的每个像素的中值
Median of each pixel of a set of images
我想计算一组图像中每个像素的中值或"video"。但是,当 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);
此代码可以受益于大量重构。一方面,你是 re-reading 帧,你可以只读取一次,存储它们并在完成后使用它们。
其次,遍历所有像素来计算中位数会非常慢。从代码中的外观来看,对于前 nb_frames_bk
帧上的每个空间位置,您收集这些帧内的所有 RGB 值并计算 RGB 值的中值。
另请注意,由于您错误地定义了输出矩阵,因此出现维度超出错误。您将其定义为 M x N
,其中 M
是 宽度 ,N
是 高度 。这个需要换。请记住,矩阵首先被定义为 height,其次是 width。但是,这对于我要正确实施它的建议是不必要的。
不是一次读取一个帧,而是指定一个范围帧。这样,您将获得一个 4D 矩阵,其中前三个维度引用图像,第四个维度表示帧编号。然后,您可以在第四维中取中值以找到所有帧的中值 RGB 值。
换句话说,只需这样做:
V = VideoReader('hall_monitor.avi');
nb_frames_bk = 5;
frms = read(V, [1 nb_frames_bk]);
IB = median(frms, 4);
imshow(IB);
这要好得多,而且保证速度更快。您也不需要获取每个帧的宽度和高度,因为不再需要它,因为我们不再循环遍历每个像素。
我想计算一组图像中每个像素的中值或"video"。但是,当 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);
此代码可以受益于大量重构。一方面,你是 re-reading 帧,你可以只读取一次,存储它们并在完成后使用它们。
其次,遍历所有像素来计算中位数会非常慢。从代码中的外观来看,对于前 nb_frames_bk
帧上的每个空间位置,您收集这些帧内的所有 RGB 值并计算 RGB 值的中值。
另请注意,由于您错误地定义了输出矩阵,因此出现维度超出错误。您将其定义为 M x N
,其中 M
是 宽度 ,N
是 高度 。这个需要换。请记住,矩阵首先被定义为 height,其次是 width。但是,这对于我要正确实施它的建议是不必要的。
不是一次读取一个帧,而是指定一个范围帧。这样,您将获得一个 4D 矩阵,其中前三个维度引用图像,第四个维度表示帧编号。然后,您可以在第四维中取中值以找到所有帧的中值 RGB 值。
换句话说,只需这样做:
V = VideoReader('hall_monitor.avi');
nb_frames_bk = 5;
frms = read(V, [1 nb_frames_bk]);
IB = median(frms, 4);
imshow(IB);
这要好得多,而且保证速度更快。您也不需要获取每个帧的宽度和高度,因为不再需要它,因为我们不再循环遍历每个像素。