【问题标题】:Weighted Centroid of an Array阵列的加权质心
【发布时间】:2011-11-11 17:12:37
【问题描述】:

所以我有一个代表坐标平面的二维数组,一个图像。在该图像上,我正在寻找“红色”像素,并根据我的相机找到的所有红色像素(希望)找到红色 LED 目标的位置。目前,我只是将十字准线拍打在所有红色像素的质心上:

// pseudo-code

for(cycle_through_pixels)
{
   if( is_red(pixel[x][y]) )
   {
      vals++; // total number of red pixels
      cx+=x;  // sum the x's
      cy+=y;  // sum the y's
   }
}
cx/=vals; // divide by total to get average x
cy/=vals; // divide by total to get average y

draw_crosshairs_at(pixel[cx][cy]); // found the centroid

这种方法的问题在于,虽然这种算法自然地将质心放置在靠近最大斑点(红色像素最多的区域)的位置,但当一点红色闪烁到由于眩光或其他轻微干扰而导致的侧面。

我的问题是这样的:

如何更改此模式以寻找更加权的质心?简而言之,我想让较大的红色斑点比较小的红色斑点更重要,甚至可能完全忽略远处的小斑点。

【问题讨论】:

  • 如果您必须在飞机的左侧和右侧“相同”的红点。质心算法不会在没有红色的图像中心绘制十字准线吗?如果你给方程增加权重,这个问题仍然存在,即使它不太可能。
  • 是的,在这种情况下,算法的表现非常糟糕。然而,这一切都与我计划进行的涉及跟踪特定目标的实际演示有关,其想法是虽然会有一些干扰,但绝不应该有任何与现场目标接近相同的东西(它是一个非常可区分的目标)。这里的想法是让算法更加关注我更大的红色来源,同时保持一些能力,如果它变得更远或受到轻微阻碍,可以保持它“锁定”。

标签: math image-processing centroid


【解决方案1】:

您可以在图片中找到connected components,并且在您的质心计算中仅包括总大小超过某个阈值的那些组件。

【讨论】:

  • 我自己提出了这个概念的基本概念,并认为它太古怪了,我永远不会知道在 Google 搜索中如何称呼它。非常感谢你给我看这个,有机会我会试试的。
  • 这是一种很常见的图像处理操作。如果您使用的是图像处理工具包,它可能已经有一个功能。
  • 这非常有效!首先,实现这个概念正是我想要的:我的小浮动十字准线保持在屏幕上最大斑点的中心,几乎忽略了小的干扰,只对较大的错误斑点产生轻微的拖拽。除此之外,我的十字准线变得异常稳定。以前,它会在无人机轻微移动或灯光变化时以故障方式跳来跳去,现在它在屏幕上流畅地流动。
【解决方案2】:

我认为最简单(也许是幼稚)的答案是:不仅计算像素值,还计算周围的 8 个像素(总共 9 个)。现在,每个取值都可以是从 0 到 9,并且对于具有相同颜色的 blob 包含更大的值。现在,您将不再使用vals++,而是将值增加周围区域的像素数。

【讨论】:

  • 你提出这个很有趣,更有趣的是你称它为幼稚,因为我实际上在将它视为一个愚蠢和黑客式的概念之前简单地考虑过类似的事情。我告诉自己我应该坚持更传统的道路。然而,正如你和 tkerwin 今天向我展示的那样,我并不是唯一提出这个概念的人,而且它显然被广泛使用并且非常有效。明天我会尝试实施它。谢谢!
猜你喜欢
  • 2016-07-04
  • 2016-11-28
  • 1970-01-01
  • 2014-06-30
  • 2023-03-17
  • 2020-02-09
  • 1970-01-01
  • 2020-08-04
  • 2012-10-30
相关资源
最近更新 更多