OpenCV:使用Hough变换检测抛物线

时间:2011-07-14 03:49:33

标签: image opencv hough-transform

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

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)的输入给出预期的输出。有时候第二个或第三个最大值,甚至第十个最大值都给出了预期的输出。我需要约。 'a','x1','y1'的值(不是确切的值)。

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

1 个答案:

答案 0 :(得分:2)

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

如果你想找到这些类型的抛物线

 y^2 = 4a*x

然后它们仅通过一个参数“a”进行参数化。因此,我真的不明白你为什么使用3维累加器。

当然,如果你想找到一个抛物线,它有一个更通用的方程式,如:

y = ax^2 + bx + c

或在y方向上将x替换为y,您将需要一个三维累加器,如您的示例所示。

我认为在你的情况下问题可以轻易解决,说你只需要一个累加器(因为你只有一个参数可以累积: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
  }

我希望它可以帮到你, This is as well an interesting thing to look at : 于连