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

3

我想在一张512 X 512像素大小的图片中检测抛物线(类型为y^2 = 4a*x)。我准备了一个累加器数组,acc(大小为512 X 512 X 512)。我准备了一个对应于该图像的矩阵。我使用了hough-transform方法。以下是我的操作过程:

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”的近似值(而非精确值)。

请帮忙。我的概念有什么错误吗?


您可以发布一个图像示例的链接。 - Dr. belisarius
1个回答

3
我会尽力回答你的问题,虽然我的答案可能只能部分满足你的要求。
如果你想要找到这些类型的抛物线:
 y^2 = 4a*x

那么它们只由一个参数'a'参数化。因此,我真的不明白为什么您要使用三维累加器。

当然,如果您想找到一个更一般的抛物线方程,比如:

y = ax^2 + bx + c

如果你将x替换为y,或者在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
  }

我希望这能对你有所帮助, 这也是一个有趣的东西: Julien,


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接