4

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

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

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

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

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

在此处输入图像描述

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

在此处输入图像描述

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

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

任何人都可以帮我解决这个问题吗?

4

1 回答 1

1

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

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

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

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

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

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

祝你好运。

于 2011-04-12T22:10:01.003 回答