图像减法分割的优化算法

时间:2011-04-08 22:52:36

标签: image image-processing opencv computer-vision image-segmentation

对于OpenCV中的项目我希望尽可能好地分割移动物体,当然噪音最小。

为此,我想使用图像减法算法。 我已经有一个正在运行的程序,但今天找不到方法来获得足够公平的结果。

我已经给出了以下(灰度)图像:

IplImage* grayScale;
IplImage* lastFrame;
IplImage* secondLastFrame;
IplImage* thirdLastFrame;

到目前为止,我尝试使用cvSub();cvAbsDiff();减去当前帧图像和最后一帧以获取移动部件。

但不幸的是,我仍然在那里得到很多噪音(即由于在刮风的时候稍微移动树木)以及移动的物体是否相当大并且具有同色的颜色(让我们说穿白色或黑色衬衫的人) ,减法只检测人的左侧和右侧图像的变化,而不是身体本身的变化,因此有时会将一个物体检测为两个物体......

cvAbsDiff(this->lastFrame,grayScale,output);
cvThreshold(output,output,10,250, CV_THRESH_BINARY);
cvErode(output,output, NULL, 2);
cvDilate(output,output, NULL, 2);

为了消除这种噪音,我试图用cvErode()cvDilate()来侵蚀和扩张图像,但这很慢,如果屏幕上的移动物体很小,则侵蚀会消除很多大部分物体因此在放气后我并不总是得到好结果或分裂物体。

在此之后我做cvFindContours()来获取轮廓,检查尺寸以及是否适合在移动物体周围画一个矩形。但结果很差,因为由于分割不良,对象通常被分成几个矩形。

一位朋友现在告诉我,我可能会尝试使用两个以上的帧进行减法,因为这可能已经减少了噪音...但我真的不知道他的意思是什么以及我应该如何添加/减少帧可以获得几乎没有噪声的图像,并显示足够大的对象斑点。

有人可以帮我吗?如何使用多个帧来获得尽可能具有最小噪声但具有足够大的移动物体斑点的图像?我会感谢任何琐事......

加法:

我已经在这里上传了一个当前视频:http://temp.tinytall.de/也许有人想在那里试一试......

这是一个框架:左边的图像显示了cvFindContours()的结果,右边的是分割后的图像,然后我试图找到轮廓......

segmentation result

所以一个大型物体如果运动得足够快就可以正常工作......即自行车......但是对于行走的人来说,它并不总能得到一个好的结果......任何想法?

3 个答案:

答案 0 :(得分:2)

给定三个相邻的帧A,B,C,你可以得到两个帧差X和Y.通过组合X和Y(通过例如阈值和逻辑AND操作),你可以减少噪声的影响。不需要的副作用是运动检测区域将略小于理想值(AND操作将减小区域)。

由于数十年来对图像序列运动估计进行了很好的研究,您可能希望了解更复杂的运动检测方法,例如:使用运动矢量字段。在这种情况下,Google学术搜索是您的朋友。

答案 1 :(得分:2)

好像你有固定的背景。 一种可能的解决方案是让计算机学习背景,例如。平均随着时间的推移。然后计算平均图像和电流之间的差异。差异可能源于移动物体。

答案 2 :(得分:1)

嗯,这是一个非常冒险的主题。运动估计非常复杂。因此,尝试找到好的文献,避免发明算法:)

我的建议是:

  

搜索捆绑图像以进行运动估算。捆绑使用许多图像来降低噪音和错误率。

     

最终,如果您想要健壮,请查看所谓的卡尔曼滤波器。如果您正在跟踪对象,则不希望它们在帧之间进行“无限速度跳跃”(通常是噪声或未命中)。这是我强烈建议的一个C ++库Kalman filter

     

最后,MonoSLAM,我推了一下:) Andrew Davison: Research