删除移动的对象以从多个图像中获取背景模型

时间:2014-03-28 13:58:20

标签: c++ algorithm opencv image-processing computer-vision

我想在固定相机拍摄的多张图像中找到背景。相机检测移动物体(动物)和捕获的连续图像。因此,我需要通过处理5到10个具有相同背景的捕获图像来找到简单的背景模型图像。

有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:0)

如果您只有5张图片,则很难识别背景,而大多数复杂的技术可能无法正常工作。有关一般背景识别方法,请参阅http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=280225&url=http%3A%2F%2Fieeexplore.ieee.org%2Fiel3%2F1352%2F6939%2F00280225.pdf%3Farnumber%3D280225

答案 1 :(得分:0)

如果

  • 每个像素位置在超过一半的帧中显示为背景,
  • 像素的颜色在其背景的帧子集中变化不大,

然后有一个非常简单的算法:对于每个像素位置,只取所有帧的中位数强度

为什么?假设图像是灰度的(这使得它更容易解释,但该过程也适用于彩色图像 - 只需单独处理每个颜色组件)。如果特定像素在超过一半的帧中显示为背景,则当您在所有帧中获取该像素的强度并对其进行排序时,背景色像素必须出现在中间(中位)位置。 (在最坏的情况下,所有背景色的像素按此顺序被推到最前面或后面,但即使这样,它们也足以覆盖中间点。)

答案 2 :(得分:0)

您的最终目标是找到前景吗?你能展示一些图片吗?

如果动物移动得足够快,它们会产生很多强度变化,而背景像素将在大多数帧之间保持密切相关。我不会写你真正的代码,但会在openCV中给你一个伪代码。主要思想是仅平均相关像素:

Mat Iseq[10];// your sequence
Mat result, Iacc=0, Icnt=0; // Iacc and Icnt are float types
loop through your sequence, i=0; i<N-1; i++
   matchTemplate(Iseg[i], Iseq[i+1], result, CV_TM_CCOEFF_NORMED);
   mask = 1 & (result>0.9); // get correlated part, which is probably background
   Iacc += Iseq[i] & mask + Iseq[i+1] & mask; // accumulate background infer
   Icnt += 2*mask; // keep count
end of loop;
Mat Ibackground = Iacc.mul(1.0/Icnt); // average background (moving parts fade away) 

要改善结果,您可以降低图像分辨率或应用模糊以增强相关性。例如,您还可以通过腐蚀清除小型连接组件中的每个掩模。