2

タイプの放物線を検出したい: y^2 = 4a*x 画像 [サイズ: 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) の最大値エントリが常に意図した出力を与えるとは限りません。場合によっては、2 番目または 3 番目の最大値、さらには 10 番目の最大値でも意図した出力が得られます。私は約が必要です。'a'、'x1'、'y1' の値 (正確な値ではありません)。

私を助けてください。私のコンセプトに何か問題はありますか?

4

1 に答える 1

2

私が言おうとしていることは、あなたの質問に部分的にしか答えないかもしれませんが、うまくいくはずです.

これらのタイプの放物線を見つけたい場合

 y^2 = 4a*x

次に、それらは「a」である1つのパラメーターのみによってパラメーター化されます。したがって、3次元のアキュムレータを使用する理由がよくわかりません。

確かに、次のようなより一般的な方程式で放物線を見つけたい場合:

y = ax^2 + bx + c

または、x を y に置き換えることで y 方向に、例のように 3 次元アキュムレータが必要になります。

あなたの場合、アキュムレータは1つしか必要ないと言って、問題は簡単に解決できると思います(蓄積するパラメータが1つしかないため: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
  }

お役に立てば幸いです。 これも興味深いものです。: ジュリアン,

于 2011-07-14T15:58:09.450 に答える