【问题标题】:Median of each pixel of a set of images一组图像的每个像素的中值
【发布时间】:2018-03-01 21:21:48
【问题描述】:

我想计算一组图像或“视频”中每个像素的中值。然而,当 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】:

    此代码可以从大量重构中受益。一方面,您可以重新阅读帧,而您只需阅读一次、存储它们并在完成后使用它们。

    其次,遍历所有像素来计算中值会非常慢。从代码中的样子来看,对于第一个 nb_frames_bk 帧上的每个空间位置,您收集这些帧中的所有 RGB 值并计算 RGB 中值。

    另外作为一个小提示,你得到一个维度超过错误,因为你定义了错误的输出矩阵。您将其定义为M x N,其中MwidthNheight。这需要交换。请记住,矩阵首先定义为 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);
    

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

    【讨论】:

    • 请注意,像这样分别计算中值​​ R、G 和 B 值会得到图像中不存在的 RGB 值。这样你很可能会得到假颜色。理想情况下,您会计算向量中值,它是输入集的 RGB 值之一。这当然要贵得多,而且可能不值得,但我想指出这一点。
    • @CrisLuengo 一个很好的观点,这是我忽略的。向量中值是稳健的,因为最终颜色将来自输入集。我没有走这条路,因为我想专注于优化 OP 提供的代码。无论哪种方式都很好的观察。
    • @KiMaN 不客气。不用担心。我上面写的答案来自多年的MATLAB经验,我很乐意回答。请不要害怕在您的 MATLAB 之旅中提出更多问题。祝你好运!
    • median 函数有第二个参数,用于指定是否评估特定维度中的中值,同时保持其余维度不变。例如,执行median(frms, 2) 将执行矩阵每一行的中值,同时独立地保留其余部分。因此,将median(frms, 4) 视为在时间维度 中执行中值,在图像中每个唯一的空间位置,我们将找到中值RGB 颜色像素值。从概念上很难想象这一点,但可以将第四维度视为时间。
    • 现在我更清楚了,再次感谢@rayryeng​​span>
    猜你喜欢
    • 1970-01-01
    • 2019-07-07
    • 2019-08-07
    • 1970-01-01
    • 2012-04-24
    • 2020-03-19
    • 2021-02-12
    • 2021-07-09
    • 2017-08-23
    相关资源
    最近更新 更多