使用中位数的背景减法

时间:2017-06-19 21:37:54

标签: matlab image-processing video-processing median background-substraction

我需要在matlab中执行背景减法。 我有一个短视频,一个男人从右到左穿过墙,所以这是一个简单而稳定的视频。

我了解了一种使用时间中位数来估算背景的方法:我们需要采用一些帧窗口(比方说 - 25帧),并且随着时间的推移执行中值 以便我们可以得到“中值图像”应该是对BG的良好估计(在那种视频中,对于足够大的窗口,关于BG像素的BG,移动物体的存在应该可以忽略不计)。一旦我们进行了BG估计,我们就可以从帧等中减去它。

我的问题是:

  1. 如果我的视频是RGB视频 - 我该如何执行中位数操作?我尝试使用每个帧的Hue通道,但它不起作用(请参阅下面的代码)。
  2. 基本上 - 最简单的方法是什么?我不确定我的实施质量,并希望得到一些建议......谢谢
  3. 编辑:我正在使用的视频与“分类数据库”下的here非常相似 - > “行走”。

    K = 31; % window size
    half_win = (K+1)/2;
    thresh = 0.7; % threshold for the subtraction
    
    reader = VideoReader('input.avi');
    writer  = VideoWriter('bianry.avi');
    open(writer);
    
    window = cell(1,K);
    % handling first frame
    [h,~,~] = rgb2hsv(im2single(readFrame(reader)));
    window{half_win} = h;
    k = 1;
    % mirror padding of frames
    while hasFrame(reader)
        if k == half_win
            break
        end
        [h,~,~] = rgb2hsv(im2single(readFrame(reader)));
        window{half_win + k} = h;
        window{half_win - k} = h;
        k = k + 1;
    end
    n = ndims(window{1});
    bg = median(cat(n+1, window{:}), n+1);
    fg = abs( window{half_win} - bg ) > thresh;
    writeVideo(writer, im2uint8(fg));
    
    while hasFrame(reader)
         [h,~,~] = rgb2hsv(im2single(readFrame(reader)));
        % update window
        window(1:K-1) = window(2:K);
        window{K} = h;
        bg = median(cat(n+1, window{:}), n+1);
        fg = abs( window{half_win} - bg ) > thresh;
        writeVideo(writer, im2uint8(fg));
    end
    
    % mirror padding for the end of the video
    ind = K-1;
    for k=1:(half_win - 1)
        frame_to_mirror = window{ind};
        window(1:K-1) = window(2:K);
        window{K} = frame_to_mirror;
    
        bg = median(cat(n+1, window{:}), n+1);
        fg = abs( window{half_win} - bg ) > thresh;
        writeVideo(writer, im2uint8(fg));
        ind = ind -2;
    end
    
    close(writer);
    

0 个答案:

没有答案