-1

次の画像のピーク (x 軸) の位置が検出されます

ここに画像の説明を入力

画像が垂直の場合、CvMinMax を適用してピークを見つけます。しかし、ここは水平なので苦労しています。CvMinMax を使用してこのピークを特定する方法はありますか? (画像を回転させたくない)

最後のオプションとして、各列を検索する必要がありますが、これは非常にコストがかかるため、実行したくありません。そのようなピークを検索する最適化された方法はありますか?

4

2 に答える 2

0

行ごとに画像のピクセルにアクセスし、単純な距離アプローチを使用します。そのためのコードも必要ないことを願っています。

于 2012-05-29T11:04:57.483 に答える
0

高速な方法は次のとおりです。

  1. を使用して、すべての列の合計を一度に取得しますcv.Reduce。これにより、列の合計のベクトルが得られます。
  2. このベクトルにしきい値を設定して、効果的にバイナリにします。
  3. 縦軸で画像を反転します。
  4. cv.MinMaxLoc左から見つけた最初の最小値と最初の最大値の位置を報告するを使用します (画像はバイナリであるため、ゼロ以外の最初の値が得られます)。
  5. 列の位置を計算します。

ここでは Python で実装されています。これらはすべて組み込みの opencv 関数であるため、C に変換するのは非常に簡単です。

def find_left_max4(im):
    sums = cv.CreateImage((im.width, 1), cv.IPL_DEPTH_32F, 1)
    cv.Reduce(im, sums, dim=0, op=cv.CV_REDUCE_SUM)
    cv.Threshold(sums, sums,200, 255, cv.CV_THRESH_BINARY)
    cv.Flip(sums, flipMode=1)
    return sums.width - cv.MinMaxLoc(sums)[3][0] - 1

im = cv.LoadImage('zfUHp.jpg',cv.CV_LOAD_IMAGE_GRAYSCALE)
print find_right_max4(im)
#Output:
324

このアプローチをスピードで打ち負かすことはできないと思います。私の遅いコンピューターでは、54 µs でクロックインします (以前の投稿よりも 10 倍高速です)。

于 2012-05-28T07:35:05.827 に答える