私は画像処理に不慣れで、ドキュメント画像の線の検出に取り組んでいます。私はハフライン変換の理論を読みましたが、多くのチュートリアルで言われているように、opencvでその関数を呼び出す前にCannyを使用しなければならない理由がわかりません。この場合、エッジを見つけるポイントは何ですか?実際、HoughLines()の前にCannyまたはthresholdを使用しないと、結果が非常に乱雑になります。誰かが私にその理由を説明してくれることを願っています。
私が読んだチュートリアルの2つ:
短い答え
cvCannyは、エッジの検出、コントラストの向上、画像ノイズの除去に使用されます。ハフ変換を使用するHoughLinesは、これらのエッジが線であるかどうかを判別するために使用されます。ハフ変換では、効率的で意味のある結果を提供するために、エッジを適切に検出する必要があります。
長い答え
ハフ変換 の制限については、ウィキペディアで詳しく説明されています。
ハフ変換の効率は、蓄積されたピクセルのビンが明確であることに依存しています。ピクセルとその周囲の隣接領域との間の直接コントラスト、またはマスク領域を使用している場合は、ピクセル領域とその周囲の領域。すべてのピクセルが同様の累積値を持っている場合、線または円として目立つものはありません。これは、契約を増やすために色の減少(色からグレースケールへ、グレースケールから白黒へ)につながります。
ハフ変換のパラメーターの数は、ピクセルビン内の投票の広がりを増やし、変換の複雑さを増します。つまり、パラメーターが3つ未満であるため、通常、線または円のみが確実に検出されます。
ハフ変換を実行する前にエッジを十分に検出する必要があります。そうしないと、効率がさらに低下します。また、ノイズの多い画像は、ノイズを事前に除去しない限り、ハフ変換ではうまく機能しません。
まず、線を検出するには、boolean
マトリックス画像(またはバイナリ)で作業する必要があります。つまり、色はblackまたはwhite、 grayscaleはありません。
HoughLines()
が正しく機能するための要件は、この種の画像を入力として使用することです。これが、Canny
またはTreshold
を使用して、colored画像行列をbooleanに変換する必要がある理由です。
ハフ変換
1つの画像の線は、実際にはエッジです。ハフ変換は画像全体をスキャンし、すべてを変換する変換を使用します白極座標のピクセルデカルト座標。 黒ピクセルは省略されています。したがって、最初にエッジを検出しないと、線を取得できません。これは、HoughLines()
が、グレースケールがある場合の動作方法を知らないためです。
理論的には、あなたは正しいです。ハフラインアルゴリズムが機能するために、エッジを見つけることは絶対に必要というわけではありません。
ハフが機能する方法は、基本的にすべてのポイントを取り、それを他のすべてのポイントに接続することです。どのポイントでも、最も多くの線が通過していても、それらの線は残ります。このためには、ポイントが必要です。キャニーはそれらのポイントを作成します。理論的には、あらゆる種類のフィルターを使用できます-すべての青または紫のポイントを分離し、それらを接続します-しかし、エッジはうまく機能します。
ハフはまた、その線や点に重みを付けません。ハフにとって、画像はバイナリです-1または0、ポイントまたはポイントではないもので構成されます。グレースケールの必要はなく、キャニーは便利なバイナリ画像を返します。
したがって、キャニーは常にハフの一部です。