web-dev-qa-db-ja.com

ハフ変換について説明する

私は冒険的で、コンピュータービジョンに向けた最初の赤ん坊の一歩を踏み出しています。私は自分でハフ変換を実装しようとしましたが、全体像がわかりません。私はウィキペディアのエントリを読み、リチャードデューダとピーターハートによるオリジナルの「ハフ変換を使用して写真の線と曲線を検出する」ことさえしましたが、助けにはなりませんでした。

誰かがもっと親しみやすい言葉で私に説明してくれませんか?

47
Haoest

長方形座標の線を考えるのがより一般的です。 y = mx + b。ウィキペディアの記事で述べられているように、線は極座標形式で表すこともできます。ハフ変換はこの表現の変化を利用します(とにかく、線の場合。ディスカッションは円、楕円などにも適用できます)。

ハフ変換の最初のステップは、画像をエッジのセットに縮小することです。 Canny Edge-detectorは頻繁に選択されます。結果のエッジ画像は、ハフプロセスへの入力として機能します。

要約すると、エッジ画像で「点灯」したピクセルは極座標形式に変換されます。つまり、その位置は方向を使用して表されます シータ そして距離 r - の代わりに バツ そして y。 (画像の中心は、この座標変更の基準点として一般的に使用されます。)

ハフ変換は基本的にヒストグラムです。同じシータとrにマッピングするエッジピクセルは、画像内の線を定義すると見なされます。発生頻度を計算するには、 シータ そして r 離散化されます(いくつかのビンに分割されます)。すべてのEdgeピクセルが極座標形式に変換されると、ビンが分析されて元の画像の線が決定されます。

を探すことは一般的です N 最も頻繁なパラメータ-またはいくつかよりも小さい数になるパラメータのしきい値  無視されます。

この答えが最初に提示した情報源よりも優れているとは思いませんが、行き詰まっている特定の点はありますか?

39
Throwback1986

以下は、ハフ変換が画像内の線を検出するためにどのように機能するかを示す非常に基本的な視覚的な説明です。

enter image description here

118
mlai

ハフ変換は、直線(または円、または他の多くのもの)を表す最も可能性の高い値を見つける方法です。

入力として、ハフ変換に線の画像を与えます。この画像には、線の一部であるピクセルと背景の一部であるピクセルの2種類のピクセルが含まれます。

ラインの一部であるピクセルごとに、パラメーターの可能なすべての組み合わせが計算されます。たとえば、座標(1、100)のピクセルがラインの一部である場合、それは勾配(m)= 0およびy切片(c)= 100であるラインの一部である可能性があります。 m = 1、c = 99の一部であること。またはm = 2、c = 98;またはm = 3、c = 97;等々。線の方程式y = mx + cを解いて、すべての可能な組み合わせを見つけることができます。

各ピクセルは、それを説明できる各パラメーター(mおよびc)に1票を投じます。想像できますが、ラインに1000ピクセルある場合、mとcの正しい組み合わせは1000票になります。

最も投票数の多いmとcの組み合わせが、行のパラメーターとして返されます。

15
Ray Hidayat

これは別の視点です(テレビ番組のパイロットエピソードで使用されるものNumbers):噴水のような芝生のスプリンクラーが以前の芝生のどこかにあり、それ自体の周りに水滴を投げ出したと想像してください。これでスプリンクラーはなくなりましたが、水滴は残っています。各ドロップを独自のスプリンクラーに変え、それ自体がその周りに液滴をキャストすることを想像してください-ドロップはどの方向から来たのかわからないため、すべての方向に。これにより、大量の水が一度にすべての液滴から当たるスポットがあることを除いて、地面の周りに薄い水がたくさん分散します。そのスポットは、元のスプリンクラーがあった場所です。

(例えば)ライン検出への応用も同様です。画像の各点は、元の液滴の1つです。スプリンクラーとして機能する場合、その点を通過する可能性のあるすべての線をマーキングする独自の液滴を送信します。大量の二次液滴が着弾する場所は、多数の画像ポイントを通過するラインのパラメータを表します-VOILA!ラインが検出されました!

1
PMar