Вычитание фона с использованием медианы во времени
Мне нужно выполнить вычитание фона в Matlab. У меня есть короткое видео человека, пересекающего стену справа налево, так что это простое и довольно устойчивое видео.
Я узнал о методе оценки фона с использованием медианы во времени: нам нужно взять некоторое окно кадров (скажем, 25 кадров) и выполнить медиану со временем, чтобы мы могли получить "медианное изображение", которое должно быть хорошим оценка для BG (в видео такого типа для достаточно большого окна присутствие движущегося объекта должно быть незначительным по отношению к BG для пикселя BG). как только мы получим оценку BG, мы сможем вычесть ее из кадра и т. д.
Мои вопросы:
- Если мое видео является видео RGB - как мне выполнить медианную операцию? Я пытался использовать канал Hue каждого кадра, но он не работает (см. Мой код ниже).
- в принципе - какой самый простой способ сделать это? Я не уверен в качестве моей реализации и хотел бы получить совет... спасибо
РЕДАКТИРОВАТЬ: видео, которое я использую, очень похоже на те, которые можно найти здесь в разделе "База данных классификации" -> "Прогулка".
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);