% input: im1, im2, im3, im4, im5
% output: background image F
F = im1;
for i=1:3
A = cat(3,im1(:,:,i),im2(:,:,i),im3(:,:,i),im4(:,:,i),im5(:,:,i));
F(:,:,i) = median(A,3);
end
figure,imshow(F)
在工程应用中,常常需要对固定相机拍摄的n幅图像做一个背景建模,然后用图像减去背景就得到运动变化部分。背景建模的方法很多,常用的有GM,GMM,这些经典算法在openCV里都集成了,但是速度上还不是特别快。对于类似的情况其实有更简单的方法建背景--中值背景就是在工程中用得最多,效果最理想的方法之一。 注意,这里说的中值,就是median,不是mean(均值)。
计算中值的过程:举个例子,对5个数[20 30 32 23 90]计算中值,首选需要对其排序,用冒泡排序算法得到的结果应该是[20 23 30 32 90],然后取中间一个数,即30。
计算中值图像( F )的时候,就是要对n幅图像( A1, A2, ..., An )上每个像素位置分别求中值,大概就是:
F = median_background( A1, A2, A3, ..., An )
s.t., F(x,y) = median( [ A1(x,y), A2(x,y), ..., An(x,y) ] )
另外,我们希望算法是增量式的:比如刚才我已经对A1到An共n幅图像计算出了一个中值图像F,那么现在我又得到了第n+1幅图像,我希望更新这个背景: