【问题标题】:How to tell if the most obvious object in a picture is a shape?如何判断图片中最明显的物体是否是形状?
【发布时间】:2011-08-04 05:59:02
【问题描述】:

好吧,伙计们,我想我已经做了所有我能做的事情,除了一件重要的事情:形状提取。我已经以一种相当简单的方式做到了这一点,但是在某些情况下它确实搞砸了。我这样做的方法是:

  • 在大纲列表中选择一个点 生成一个边界矩形和 选择最接近的点 左上角(点 p)。
  • 创建一个新的 Shape 对象并添加 p 到形状的轮廓。
  • 如果主图没有更多 可供我们测试的点,我们 只需返回形状对象。
  • 从 p 中获取最近的点并存储 它最接近。
  • 而离最近的距离
    点到p点小于或
    等于十
  • ----将其添加到大纲中
  • ----从主点列表中移除
  • ----将p设置为最近的
  • ----从最近处获取另一个最近点
  • ----重复
  • 如果形状有十个或更少的点 在其大纲中,返回一个空对象 (忽略所有小形状)
  • 否则,返回形状对象。

我重复这个过程,直到主要点列表变空。这意味着我们提取了所有形状。

现在我做了几次组合形状。如果我有 |、--- 和 |,就会如此。彼此相邻,它将组合成一个矩形。你明白我的意思吗?假设我有一个圆形,上面的提取代码有时会说一半圆形是一种形状,另一半是另一种形状。所以当我组合这些形状时,它就变成了一个圆圈。

叹息,我也不能发布图片,除了上传网站,我不能在任何地方上传。这有一些问题。看看以下内容:

左图为起始图,右图为轮廓点。现在我单击确定形状按钮。它确定图片中最主要的形状(轮廓中包含最多点的形状对象)的形状。

现在,它正确地说这是一个四边形,但原因是错误的。由于我的组合形状(为了获得矩形形状而需要完成,否则它将是一个形状的一条小线和另一个形状的另一条小线),它在测试中添加了手指的轮廓。

因此测试了整个单个形状(第二张图片右侧的黑色轮廓)。不仅是“矩形”部分,而且该图片中的所有内容都经过测试。你们能想出任何方法来清理这个东西并只提取矩形部分而不是包括手指吗?我为此考虑了 A* 的一些变体,但在像这张图片这样的情况下,它不会创建循环。那么,一旦 A* 访问了每个点(因为它无法返回起点),我该怎么办。那我该怎么办?

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 嗨,我认为需要更多信息。如何创建大纲列表?您到底想分离什么(照片中的黑色大矩形、前景中的对象、所有对象的所有边缘)?
  • 我的代码大约有 700 行。你真的要我经历它的每一个部分吗?我的目标是获得图片中最主要物体的形状。所以我应该得到一个矩形。
  • OutlineLines 方法是我获得主要大纲的地方:phstudios.svn.beanstalkapp.com/c458/trunk/Project/…
  • 对不起,我后来意识到它在标题中:)。您是否打算用它来搜索黑色矩形,或者一种颜色的各种对象,甚至是多种颜色的对象?
  • 颜色无关紧要。我只是将其用于视觉表示。我基本上只有 List 大纲。它们不会被着色。除了适当的“清理/提取”算法外,我基本上已经完成了所有工作。如您所见,手指已添加到点列表中。我需要阻止这种情况发生,而且我还需要它适用于所有形状、旋转、扭曲和大小。

标签: image-processing feature-extraction shape-recognition


【解决方案1】:

我认为您的代码的以下部分不是那么明智:

    int iSelected = selected.ToArgb();
    int iNextRight = nextRight.ToArgb();
    if (Math.Abs(iSelected - iNextRight) > alpha)

因为结果是您几乎只与红色进行比较(其他颜色存储在不太重要的位置),假设您不在图像中使用 alpha。

如果你想获得更好的结果,你可以使用 Canny Edge Detector 或者至少看看它的处理步骤。

其他选项是使用类似于魔术棒的功能将主要对象与背景分离,然后提取其边缘。为此,例如可以使用 potts 模型。

如果您想要一些更简单的方法,那么您可以采用哪种方式检测边缘,但要使用所有颜色通道的差值之和。然后假设中间的点是搜索对象的一部分,并像画笔一样填充最近边缘之间的形状。如果您选择正确的门槛,您将消除那些手指。

祝你好运。

【讨论】:

  • 您认为问题在于轮廓检测而不是形状提取?
  • 提取具有良好异常值的形状要容易得多。我认为你不能简单地连接异常值,因为手指总是会被选中。
  • 如果在获取轮廓时将所选颜色转换为灰度并以这种方式执行基本算法会怎样。这会比我现在的效果更好吗?
  • 那么图像分割呢?您可以将具有相似颜色的相邻像素连接到平面对象。然后找到最大的中心物体并对其边缘的形状进行分类。
  • 那么你认为我应该在形状提取阶段也考虑颜色吗?如果形状上有绿色标签或其他东西怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 2018-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
  • 2014-11-02
相关资源
最近更新 更多