【问题标题】:Calculate shape orientation in Java (Image analysis)在 Java 中计算形状方向(图像分析)
【发布时间】:2012-02-12 12:56:38
【问题描述】:

我有一张这样的图片:

我需要计算它的方向。在这种情况下,形状指向屏幕的左上角。只要 3 或 4 次计算的平均值在实际方向的 5 度左右以内(它会稍微移动),精度就不是很重要。

谁能指出我的算法来做到这一点?我不介意方向是作为双精度还是向量返回。

【问题讨论】:

  • 你总是知道形状应该是什么样子吗?你知道旋转的中心在哪里吗?形状总是一样大小吗?
  • @PeterLang - 认真的吗?你必须链接图像?我认为这是一个成功的巨魔。
  • 没有巨魔。这是一个 T 形,但我使用颜色阈值来恢复形状。显然,使用此方法的边缘不会完美,因此它会返回如上所示的形状。我们可以试着保持认真吗?旋转中心几乎是形状的质心,并且大小始终相同(变化不会超过百分之几)。形状应该是一样的。唯一发生变化的情况是光照变化太快以至于相机无法应对,我们错过了一些像素。上面的例子是一个“好”的例子。

标签: java image geometry shape


【解决方案1】:

如果图像总是T形,你可以简单地得到最远的一对像素,然后从这两个either中找到最远的一对(T的边缘),找到哪个是离其他两个更远,从那个到这两个的中点画一条线。

你可以进一步细化它,然后通过比较中间线和底边的边缘来找到 T 的底边,并调整角度和偏移量,直到它实际上在中间。

【讨论】:

  • 但是,如果我找到离它们最远的那对,它会再次找到它们自己吗?如果我们从搜索中排除这些点,那么它只会找到它们旁边的像素,因为 T 并不完美,因此很可能是不对称的。
  • 这是我使用的方法,但是当 T 由于光照改变形状时,它确实会失败。这超出了我最初问题的范围,但有什么想法吗?
【解决方案2】:

我想最终的解决方案是不可能的,因为需要图像识别。我会将 2D 图像投影到轴上,即获取图像的宽度和高度,并从这些值中获取方向向量,并将它们作为组件。

【讨论】:

  • 这听起来正是我所需要的,但我该如何“投射”它呢?
  • 你是如何表示图像的?通常它是二维数组。然后对每一行求和——你会得到一个总计列,并且对每一列求和——你会得到一个总计行。拥有这一行和列确定存在的范围。取决于您对白色和彩色像素的值。假设您的x 范围从x1x2yy1y2。那么你的向量是{x2-x1, y2-y1}。您还需要知道哪里是开始,哪里是结束。可能您可以通过“胖”部分的位置来确定这一点。
【解决方案3】:

首先,有几个假设:

  1. 中心和质心“接近”
  2. T 的下降杆比横杆长

首先,确定图像的边界矩形并找到图像沿该矩形的点。对于沿线的点并且彼此之间有一定的距离(比如 5 个像素来选择一个值),您只需要从该集群中获取 1 个点。最后你应该有 3 个点,即一个三角形。三角形的最短边应该是横杆(来自假设 2),即找到彼此最接近的两个点。垂直于穿过这两个点的线的线就是你的方向线,即找到它与水平轴之间的角度。

【讨论】:

    【解决方案4】:

    我会尝试morphological skeletonization 来简化图像,然后使用一些简单的算法来确定骨骼较长腿的方向。

    【讨论】:

    • 这看起来棒极了。我当然有兴趣尝试。
    【解决方案5】:

    最终的解决方案是使用Convex Hull Algorithm,它会找到将形状包围起来所需的最小点数。

    【讨论】:

      猜你喜欢
      • 2015-08-26
      • 2011-12-05
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      • 2016-05-16
      • 1970-01-01
      相关资源
      最近更新 更多