1

C++少し画像処理が必要なアプリケーションを作成しています。私はこの分野にまったく慣れていないため、どこから始めればよいかわかりません。

基本的に、いくつかのボックスを持つ長方形を含む画像があります。私が望むのは、それを分離しrectangle (x, y, width, height)、内部の各ボックスの中心座標を取得できるようにすることです (合計 18)。

パターンが見つかるまで単純な for ループを使用して画像内のピクセルをループすることを考えていましたが、より効率的なアプローチがあるかどうか疑問に思っていました。また、次のような大きなライブラリを使用せずに効率的に実行できるかどうかも確認したいOpenCV.

ここにいくつかの例の画像があります。助けていただければ幸いです。

ここに画像の説明を入力

また、このような画像処理について詳しく学べる優れたリソースは何ですか。

4

2 に答える 2

1

ここでの検出アルゴリズムはかなり単純です。ボックスオブスクエア(BOS)は常に画像の端に揃えられ、シンプルな構造になっています。これが私がそれにアプローチする方法です。

  1. 色空間を選択します。今のところRGBは問題ないと仮定しますが、他の方法でうまく機能する可能性があります。

  2. 各行について

    1. ピクセルごとに、ピクセルとそのすぐ下のピクセルの大きさの差を計算します。大きさの差は単純にsqrt((Xx)^ 2 +(Yy)^ 2 +(Zz)^ 2))です。ここで、X、Y、Zは最初のピクセルの色座標であり、x、y、zは色座標です。その下のピクセルの。RGBの場合、もちろんXYZ=RGBです。

    2. 特定のしきい値magThreshを下回る連続差の大きさの最大ランレングスを計算します。これの寛容なバージョンを選択することもできます:最大ランレングスですが、最大intrLenピクセルの長さの侵入を許可し、その後に最大contLenピクセルのロングランを続ける必要があります。これは、正方形のエッジで発生する可能性のある行間の違いに対処するためです。

  3. minWidthより上でmaxWidthより下の最大ランレングスを持つ連続するラインの最大セットを見つけます。

このようにして、ボックスを含む行を見つけました。上記の2.1でデータを再計算することにより、ボックスが水平座標のどこにあるかを知ることができます。

ボックスの端の検出は、同じことを繰り返しますが、ボックス内を左から右にスキャンすることによって行われます。その時点で、ピクセル間のにじみに気付かないおおよそのボックス重心ができます。

これはすべて、さまざまな畳み込みカーネルを介して画像を繰り返し実行した後、しきい値処理を実行することで実現できると思います。良いことは、これらの操作の両方が非常に高速なライブラリ実装を持っていることです。手作業で再実装する必要はありません。かなり遅くなる可能性があります。

于 2012-06-07T22:18:24.600 に答える
0

自分でやりたいと主張する場合 (個人的には を使用しますOpenCV。これは産業用の強度があり、無料です)、最初にエッジ検出アルゴリズムが必要になります。インターネット上にはかなりの数がありますが、いくつかの恐ろしい数学に備えてください...

多くの場合、各ピクセルを反復処理し、それとその近傍の値を行列に持ち上げてから、カーネル行列で畳み込みます。これは、すべてのピクセル (ただし、原則として、最初に検出された四角形で停止できます)、および各カラー チャネルに対して実行する必要があることに注意してください。そのため、GPU にプッシュすることを強くお勧めします。

于 2012-06-07T10:03:35.707 に答える