はじめに
Hough変換は、デジタル画像処理において特定の形状(特に直線や円)を検出するための技術です。画像中のエッジ点から、その点を通る可能性のある直線をパラメータ空間にマッピングすることで、画像中の直線を効率的に検出します。ここでは、skimage.transform の probabilistic_hough_lineを用いたハフ変換による直線検出について解説する。
コード

解説
本例では、画像内の直線を検出するためのtransform.probabilistic_hough_lineの使用方法を説明します。scikit-imageのtransform.probabilistic_hough_line関数は、古典的なHough変換を確率的に改良したバージョンです。この手法はすべてのエッジ点を処理する代わりに、ランダムにサンプリングした点のみを使用することで計算効率を大幅に向上させています。
モジュールのインポート
画像の読み込みとグレースケール化
plt.imread()でRGB画像を読み込み、rgb2gray()でグレースケールデータに変換します。
Canny法によるエッジ検出データの生成
Canny法によるエッジ検出の詳細については、下記ページで具体例を紹介しています。

ハフ変換の適用
probabilistic_hough_line()関数を使用してハフ変換による直線検出を行うことができます。
入力画像edgesには、Canny法などで抽出した輪郭が表示されているデータを使用する必要があります。
thresholdは直線検出のための閾値です。例えば10に設定すると、10ピクセルより長い線が検出されます。これは検出可能な線の最小長となります。
line_lengthパラメータは検出される線の最小許容長さを指定します。より長い線のみを検出したい場合は、この値を大きく設定します。
line_gapは線分間の最大許容間隔です。破線状になっている輪郭を一本の線として検出するには、この値を適切に大きくします。
検出結果は((x0, y0), (x1, y1))の形式のリストとして返されます。これらの座標はそれぞれ線の始点と終点を表しています。
図の表示
ax[0]には元のグレースケール画像、ax[1]にはCanny法を適用したエッジ検出結果、ax[2]にはハフ変換により検出した線を表示します。
linesリストの各要素をfor文で順次処理し、検出された直線をプロットします。
コードをダウンロード(.pyファイル) コードをダウンロード(.ipynbファイル)古典的Hough変換との違い
scikit-imageにはtransform.hough_line
という古典的なHough変換の実装も存在します。probabilistic_hough_line
との主な違いは:
- 計算効率: 確率的手法は処理が高速ですが、完全性は低下する可能性があります
- 出力形式: 確率的手法は線分の始点と終点の座標を返しますが、古典的手法はパラメータ空間の情報を返します
- パラメータ設定: 確率的手法では線分の長さやギャップに関するパラメータが追加されています
注意点とベストプラクティス
- Hough変換を適用する前に、適切なエッジ検出が重要です
- ノイズの多い画像では、前処理としてガウシアンフィルタなどを適用すると良い結果が得られます
- パラメータは対象画像の特性に合わせて調整する必要があります
- 計算コストが高いため、大きな画像では処理時間に注意が必要です
Hough変換は画像から幾何学的特徴を抽出する強力なツールであり、scikit-imageのprobabilistic_hough_line
関数を使用することで、Pythonで簡単に実装することができます。
参考

コメント