web-dev-qa-db-ja.com

バイナリ画像の曲線を検出する方法は?

バイナリ画像があります。その画像の曲線を検出/トレースしたいと思います。何も知りません(座標、角度など)。誰かが私にどのように始めるべきかを教えてもらえますか?私はこの画像を持っていると思います enter image description here

曲線と他の線を分離したい。曲線とそのパラメータにのみ興味があります。後で使用する曲線の情報を(配列に)保存したい。

16
Developer

それは本当にあなたが「曲線」によって何を意味するかに依存します。

ピクセルの各個別のコレクションを「曲線」として単純に識別したい場合は、 connected-components アルゴリズムを使用できます。各コンポーネントは、ピクセルのコレクションに対応します。次に、いくつかのテストを適用して、コンポーネントの線形性またはその他の機能を決定できます。

直線、円形曲線、またはその他のパラメトリック曲線を探している場合は、 ハフ変換 を使用して画像から要素を検出できます。

最善のアプローチは、実際には、探している曲線と、曲線について必要な情報によって異なります。

参照リンク:

1)画像分析に関する本を読む

2)黒いピクセルをスキャンし、見つかったら、同じく黒い隣接するピクセルを探し、それらの場所を保存してから白にします。これにより、1つのオブジェクトのポイントが取得され、画像から削除されます。黒いピクセルがなくなるまでこれを繰り返します。

曲線を直線から分離したい場合は、ラインフィッティングを試してから相関係数を取得してください。曲線にも同様のアルゴリズムが利用可能であり、相関関係により、理想化された形状へのポイントの近さがわかります。

2
QuentinUK

あなたはすでに良いバイナリ画像を持っているように見えるので、画像の異なる連結成分を分離してからそれらのパラメータを計算するのが最も簡単かもしれません。

まず、画像をスキャンして分離を行うことができます。黒いピクセルに遭遇した場合は、標準の flood-fill アルゴリズムを適用して、形状内のすべてのピクセルを見つけることができます。 matlab image toolboxがある場合は、 bwconncomp および bwselect の手順を使用できます。シェイプが完全に接続されていない場合は、画像に 形態学的クロージング 操作を適用してシェイプを接続することができます。

さまざまな形状をセグメント化した後、曲線が線からどれだけずれているかをテストすることで、曲線を除外できます。これを行うには、曲線の端点を取得し、端点によって定義された線から他の点がどれだけ離れているかを計算します。この値が最大値を超えると、線ではなく曲線になります。

別のアプローチは、端点の距離とオブジェクトの長さの比率を測定することです。この比率は、線の場合は1に近く、曲線や波状の形状の場合は大きくなります。

画像に曲線から分離したい角度がある場合は、曲線の方向勾配を調べることができます。形状をセグメント化し、そこから等距離の点のセットを選択し、各点について、前の点と次の点に対する角度を計算します。角度の差が大きすぎると、滑らかな曲線ではなく、角度のある形状になります。

実装で考えられる問題には、スケルトン変換によって解決できる太い線が含まれます。スケルトンのmatlab実装と曲線の端点の検索については、 matlab画像処理ツールキットのドキュメント を参照してください。

2
aleator

チェーンコードを使用して可能な別の解決策もあります。 OCRのフリーマンチェーンコードを理解する

チェーンコードは基本的に、各ピクセルに1〜8(または0〜7)の値を割り当て、8つの接続された近隣のどのピクセル位置に接続された先行が存在するかを示します。したがって、ハックワースの提案で述べたように、連結成分のラベル付けを実行してから、各成分曲線のチェーンコードを計算します。チェーンコードの分布と勾配を見ると、線と曲線を簡単に区別できます。ただし、この方法の問題は、振動曲線がある場合です。この場合、勾配はあまり有用ではなく、チェーンコードのクラスタリングに依存します。

1
beedot