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