这是由拍摄照相机捕获的源图像:
这就是我想要得到的。此输出图像可以是二进制图像或RGB。
我已经尝试了许多方法来解决问题,但每次都在特定点失败。所以请先了解我的确切问题。
1. 图像是由拍摄照相机捕获的,该相机是运动检测器。当鹿出现在相机前面时,它会捕捉图像。 2. 场景模式会随着天气变化或昼夜变化而改变。因此,我不能使用帧差异或类似的东西。 3. 分割可能无法正确工作,因为前景(鹿)和背景在许多情况下具有相同的颜色。
如果有任何不清楚的地方,请先问清楚再回答,将不胜感激。谢谢。
以下是我会做的:
正如评论中提到的,你可以检测鹿并对其进行grabcut以将其从图片中分割出来。
为了检测鹿,我会将分类器与滑动窗口方法结合起来。这意味着你将拥有一个分类器,它可以给定图像中的一个补丁(可以是一个大的补丁),输出一个得分,该得分表明该补丁与鹿有多相似。滑动窗口方法意味着你循环窗口大小,然后循环窗口位置。对于图像中窗口的每个位置,你应该在该窗口上应用分类器,并获得一个评分,该评分表明该窗口“看起来像”鹿。一旦完成,阈值所有分数,以获取“最佳窗口”,即最像鹿的窗口。这样做的原理是如果图像中存在鹿,则分类器将在所有接近/重叠实际鹿位置的窗口上输出高分数。我们希望将所有这些位置合并为单个位置。这可以通过应用OpenCV的groupRectangles函数来完成:
http://docs.opencv.org/modules/objdetect/doc/cascade_classification.html#grouprectangles
请看一些OpenCV中的人脸检测示例,它基本上做了相同的事情(滑动窗口+分类器),其中分类器是Haar级联。
现在,我没有提到那个“亲爱的分类器”可以是什么。您可以使用HOG + SVM(两者都包含在OpenCV中),或者使用运行深度卷积神经网络(deep CNN)的更强大方法。幸运的是,您不需要训练深度CNN。您可以使用以下软件包及其“即用型”ImageNet网络(非常强大,甚至可以在不进一步训练的情况下识别出鹿):
Decaf- 仅供研究使用: https://github.com/UCB-ICSI-Vision-Group/decaf-release/
或者Caffe - 使用BSD许可证:
http://caffe.berkeleyvision.org/
这里还有其他软件包,您可以在此处阅读相关信息: http://deeplearning.net/software_links/
最常见的软件包是Theano、Cuda ConvNet和OverFeat(但这真的是基于个人观点的,您应该从我链接的列表中选择最佳软件包)。
“现成的”ImageNet网络是在大约1000个类别的1000万张图像上进行训练的。如果这些类别包含“dear”,那么您可以直接使用它们。如果没有,您可以使用它们提取特征(在Decaf的情况下为4096维向量),并对正负图像进行分类器训练,以构建“dear分类器”。
现在,一旦您检测到了“dear”,也就是说,您在其周围有一个边界框,您可以应用grabcut:
http://docs.opencv.org/trunk/doc/py_tutorials/py_imgproc/py_grabcut/py_grabcut.html
你需要在鹿的身上进行初始涂鸦才能执行grabcut。你可以在边界框的中间取一条水平线,希望它在鹿的躯干上。更复杂的方法是找到鹿的对称轴并将其用作涂鸦,但你需要搜索、研究并实现某种从图像中提取对称轴的方法。尝试使用混合高斯模型的OpenCV 背景减除。它们应该足够适应您的场景。当然,最终的性能将取决于具体情况,但值得一试。
由于您只想将背景与前景分离,我认为您不需要识别鹿。您需要识别场景中的运动物体。您只需要在相当长的时间间隔内分离静态的部分(背景)和非静态的部分:鹿。
有一些算法可以结合同一场景中的多个帧来确定背景,比如这个。
您提到了随着天气变化或白天和黑夜的变化考虑不同鹿的照片,场景模式会发生变化。
您可以实现一个解决方案,当检测到运动时,它可以拍摄几张照片,并在一定时间间隔内拍摄。
这个时间间隔必须足够长,以便捕捉到鹿的不同位置或离开场景,同时又足够短,以免受到场景变化的影响。也许您需要处理一些亮度变化,但我认为使用这些帧来确定背景并最终在“运动帧”中分割鹿是可行的。