【问题标题】:How to segment objects in a image without human interaction using OpenCV如何使用 OpenCV 在没有人工交互的情况下分割图像中的对象
【发布时间】:2017-05-24 05:19:35
【问题描述】:

我想使用 OpenCv 方法来分割图像。我遇到了 Grabcut 算法,但这仍然需要人工交互,比如画一个框来环绕一个对象。 所以我的问题是如何使用 OpenCv 自动进行分割?非常感谢 C++ 或 Java 中的建议和代码 sn-p。

更新:我正在尝试从盘子和餐桌中分割食物。

【问题讨论】:

  • 你能告诉我们你想要分割的图像类型吗?使用openCV切割物体的方法有很多,但是方法取决于物体的类型、对比度等。
  • 我已经更新了我的问题
  • 您最好向我们展示您想要的实际图像,否则无法帮助您,但这是基本原则:
  • 如果您有彩色图像,您的食物可能与您的盘子和桌子颜色不同(假设您想在木桌上的白盘子上找到西红柿和胡萝卜)。在这种情况下,要选择对象,使用颜色分类可能是最简单的方法。如果您只有灰度图像,则需要在图像上有足够的对比度以检测物体的边缘(基本上是您的眼睛会做的事情)。然后,您可以使用 OpenCV 提供的几种算法提取这些边缘。例如,您可以尝试使用 sobel 过滤器来获取边缘

标签: opencv computer-vision image-segmentation


【解决方案1】:

是的,grabCut 需要人工交互,但是我们可以最小化它,就像我个人使用 grabCut 算法从给定图像中分割人脸一样,所以它基本上涉及:

  • 使用 haar 级联检测给定图像中的人脸

  • 生成概率掩码,这将帮助您生成分割所需的标记。

第一部分要求您使用预制的haar cascadecreate your own,并提供足够的训练示例。

一旦你有一个工作的 haar 级联,你可以使用它来获取每个输入图像的 ROI,你可以扩展 ROI 尺寸以包括对象周围的更多空间。

所以现在在这一步中,您必须能够从给定的输入图像中裁剪所需的对象,这会减少搜索域,现在您可以创建一个概率掩码,这将指示给定 ROI 的对象的可能位置,前面的步骤是标准化输入图像所必需的,现在我们可以假设输入总是标准化的,因此对象位置在 ROI 上会有点一致。这是男性人类头发的样本概率掩码:

现在您选择 4 个阈值来为抓取创建蒙版:

  • 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
  • 否则:掩码 = cv::GC_BGD

然后您可以将其作为掩码传递以执行抓取分割。

但是semantic segmentation 有一些最近的进步,它使用 CRF 作为 RNN 技术从给定图像中分割对象,它不需要标准化的东西,但由于它依赖于 GPU 来高效运行,它不适合用于移动或低端计算机应用程序。

【讨论】:

  • 这适用于从盘子和桌子上分割食物吗?我刚刚阅读了一些关于 haar cascade 的内容,它似乎用于人脸检测。如果我错了,请纠正我。
  • 我已经知道您正在搜索与人脸无关的 haar 级联,这就是为什么我在答案中附上了这个link,您需要为此目的训练自己的级联,或者在网络上搜索如果有人已经创建了一个。
猜你喜欢
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多