使用霍夫变换的抛物线检测



我想在图像[size: 512 x 512]中检测类型为:y^2 = 4a*x的抛物线。我准备了一个累加器数组,acc[size: 512 X 512 X 512]。我准备了一个矩阵对应的图像。我用了霍夫变换。我是这样做的:

for x = 1 to 512
  for y= 1 to 512
   if image_matrix(x,y)> 245//almost white value, so probable to be in parabola
   {
     for x1= 1 to 512
       for y1= 1 to 512
       {
           calculate 'a' from (y-y1)^2 = 4*a*(x-x1).
           increment acc(i,j,k) by 1
       }
   }
if acc(i,j,k) has a maximum value.
{
   x1=i, y1=j,a =k
}

我面临以下问题:

1) acc[512][512][512]占用大量内存。它需要大量的计算。我怎样才能减小数组大小,从而最小化计算量?2) acc(i,j,k)的最大值并不总是给出预期的输出。有时第二个或第三个最大值,甚至第10个最大值给出预期的输出。我需要大约。'a', 'x1','y1'的值(不是精确值)。

请帮帮我。我的概念有什么不对吗?

我要说的可能只是部分地回答了你的问题,但它应该是有效的。

如果你想找到这些抛物线

 y^2 = 4a*x

则它们仅由一个参数参数化,即'a'。因此,我真的不明白你为什么要用三维累加器。

当然,如果你想用更一般的方程找到一条抛物线,比如:

y = ax^2 + bx + c

或在y方向上通过用y替换x,您将需要像示例中那样的三维累加器。

我认为在你的情况下,问题可以很容易地解决,说你只需要一个累加器(因为你只有一个参数累加:a)

这就是我的建议:

  for every point (x,y) of your image (x=0 exclusive) {
      calculate (a = y^2 / 4x ) 
      add + 1 in the corresponding 'a' cell of your accumulator 
      (eg: a = index of a simple table)
  }
  for all the cells of your accumulator {
      if (cell[idx] > a certain threshold) there is a certain parabola with a = idx
  }

我希望它能帮助你,这也是一件有趣的事情:朱利安,

相关内容

  • 没有找到相关文章

最新更新