web-dev-qa-db-ja.com

HoughLines(opencv)の前のCannyの使用は何ですか?

私は画像処理に不慣れで、ドキュメント画像の線の検出に取り組んでいます。私はハフライン変換の理論を読みましたが、多くのチュートリアルで言われているように、opencvでその関数を呼び出す前にCannyを使用しなければならない理由がわかりません。この場合、エッジを見つけるポイントは何ですか?実際、HoughLines()の前にCannyまたはthresholdを使用しないと、結果が非​​常に乱雑になります。誰かが私にその理由を説明してくれることを願っています。

私が読んだチュートリアルの2つ:

  1. Imgproc特徴検出
  2. ハフライン変換
26
Risa

短い答え

cvCannyは、エッジの検出、コントラストの向上、画像ノイズの除去に使用されます。ハフ変換を使用するHoughLinesは、これらのエッジが線であるかどうかを判別するために使用されます。ハフ変換では、効率的で意味のある結果を提供するために、エッジを適切に検出する必要があります。

長い答え

ハフ変換 の制限については、ウィキペディアで詳しく説明されています。

ハフ変換の効率は、蓄積されたピクセルのビンが明確であることに依存しています。ピクセルとその周囲の隣接領域との間の直接コントラスト、またはマスク領域を使用している場合は、ピクセル領域とその周囲の領域。すべてのピクセルが同様の累積値を持っている場合、線または円として目立つものはありません。これは、契約を増やすために色の減少(色からグレースケールへ、グレースケールから白黒へ)につながります。

ハフ変換のパラメーターの数は、ピクセルビン内の投票の広がりを増やし、変換の複雑さを増します。つまり、パラメーターが3つ未満であるため、通常、線または円のみが確実に検出されます。

ハフ変換を実行する前にエッジを十分に検出する必要があります。そうしないと、効率がさらに低下します。また、ノイズの多い画像は、ノイズを事前に除去しない限り、ハフ変換ではうまく機能しません。

11
Appleman1234

まず、線を検出するには、booleanマトリックス画像(またはバイナリ)で作業する必要があります。つまり、色はblackまたはwhitegrayscaleはありません。

HoughLines()が正しく機能するための要件は、この種の画像を入力として使用することです。これが、CannyまたはTresholdを使用して、colored画像行列をbooleanに変換する必要がある理由です。

ハフ変換

1つの画像の線は、実際にはエッジです。ハフ変換は画像全体をスキャンし、すべてを変換する変換を使用します極座標のピクセルデカルト座標。 ピクセルは省略されています。したがって、最初にエッジを検出しないと、線を取得できません。これは、HoughLines()が、グレースケールがある場合の動作方法を知らないためです。

11
Advicer

理論的には、あなたは正しいです。ハフラインアルゴリズムが機能するために、エッジを見つけることは絶対に必要というわけではありません。

ハフが機能する方法は、基本的にすべてのポイントを取り、それを他のすべてのポイントに接続することです。どのポイントでも、最も多くの線が通過していても、それらの線は残ります。このためには、ポイントが必要です。キャニーはそれらのポイントを作成します。理論的には、あらゆる種類のフィルターを使用できます-すべての青または紫のポイントを分離し、それらを接続します-しかし、エッジはうまく機能します。

ハフはまた、その線や点に重みを付けません。ハフにとって、画像はバイナリです-1または0、ポイントまたはポイントではないもので構成されます。グレースケールの必要はなく、キャニーは便利なバイナリ画像を返します。

したがって、キャニーは常にハフの一部です。

3
john ktejik