我想使用OpenCv方法来分割图像。我遇到了Grabcut算法,但这仍然需要人工交互,比如绘制一个框来圈出一个对象。 所以我的问题是如何使用OpenCv自动进行分割?非常感谢C ++或Java中的建议和代码片段。
更新:我正试图从盘子和桌子上分割食物。
答案 0 :(得分:2)
是的,grabCut需要人工交互,但我们可以将其最小化,就像我个人使用grabCut算法来分割给定图像中的面部一样,所以它基本上涉及:
使用haar cascade
生成概率模板,可帮助您生成细分所需的标记。
第一部分要求您使用预先制作的haar cascade或create your own,提供足够的培训示例。
一旦你有一个工作的haar级联,你可以使用它来获得每个输入图像的ROI。你可以扩展ROI尺寸以包括对象周围的更多空间。
所以现在在这一步你必须能够从给定的输入图像裁剪你需要的对象,这会减少搜索域。现在你可以创建一个概率掩码,它可以指示给定ROI的对象的可能位置,前面的步骤是规范化输入图像所必需的。现在我们可以假设输入总是被标准化,因此对象位置与ROI有些一致。以下是男性人发的概率模板掩码:
现在您选择4个阈值来为grabcut创建掩码:
- if(pix> 220):mask = cv :: GC_FGD
- else if(pix> 170):mask = cv :: GC_PR_FGD
- else if(pix> 50):mask = cv :: GC_PR_BGD
- else:mask = cv :: GC_BGD
然后您可以将其作为掩码传递以执行抓取分割。
然而semantic segmentation最近有一些进步,它使用CRF作为RNN技术来分割给定图像中的对象,它不需要归一化,但由于它对GPU的依赖性有效运行时,它不适合移动或低端计算机应用。