目次
概要
OpenCV の cv2.HoughLines、cv2.HoughLinesP を使用して直線を検出する方法について解説します。
cv2.HoughLines
公式リファレンス: cv2.HoughLines
引数
名前 | 型 | デフォルト値 |
---|---|---|
image | ndarray | |
入力画像 (1チャンネル) | ||
rho | float | |
投票の rho の解像度 (ピクセル) | ||
theta | float | |
投票の theta の解像度 (ピクセル) | ||
threshold | int | |
直線と判断する投票数 | ||
min_theta | float | 0 |
パラメータ の下限を の範囲で指定する | ||
max_theta | float | |
パラメータ の上限を の範囲で指定する |
返り値
名前 | 説明 | ||
---|---|---|---|
lines | 検出された直線のパラメータ一覧。各要素は のタプル。1つも直線が検出されない場合は None を返す。 |

サンプルコード
ハフ変換の入力は 2 値画像であるため、Canny 法でエッジを抽出した 2 値画像を作成します。
cv2.HoughLines()
に 2 値画像を渡すと、検出された直線の一覧を形状が (NumLines, 1, 2)
の ndarray で返します。
各要素は直線のパラメータ を表します。
In [1]:
In [2]:

(10, 2)
直線を matplotlib で描画します。
で表される直線のうち、画像内の始点と終点の座標を求めます。 の場合、2 点 を結ぶ垂直方向の線分になります。 それ以外の場合、
で 座標を計算します。
In [3]:

ipywidgets でパラメータ調整する
ハフ変換はパラメータ調整が必須です。ipywidgets を使って GUI 上でパラメータ調整を行う方法について記載します。
In [4]:
cv2.HoughLine
cv2.HoughLine() は直線を検出してそのパラメータを返すのに対し、この関数は線分を検出して、線分の始点と終点を返します。
公式リファレンス: cv2.HoughLinesP
引数
名前 | 型 | デフォルト値 |
---|---|---|
image | ndarray | |
入力画像 (1チャンネル) | ||
rho | float | |
投票の rho の解像度 (ピクセル) | ||
theta | float | |
投票の theta の解像度 (ピクセル) | ||
threshold | int | |
直線と判断する投票数 | ||
minLineLength | float | 0 |
この長さ未満の線分は検出対象外とする | ||
maxLineGap | float | |
同じ直線上の点と解釈するギャップの最大値 |
返り値
名前 | 説明 | ||
---|---|---|---|
lines | 検出された線分の一覧。各要素は (x1, y2, x2, y2) のタプル。1つも線分が見つからない場合は None を返す。 |
サンプルコード

In [5]:

[[336 366 336 1] [123 325 123 43] [139 328 139 41] [ 2 66 335 1] [ 4 303 332 367] [ 0 300 0 68] [141 192 335 195] [107 177 335 174] [ 27 191 185 193] [ 2 178 221 175]]

In [6]:
ハフ変換の仕組み
任意の直線は ρ、θ で表せる
直線上の任意の点を とする。 原点から直線に垂線を下ろし、その点を とすると、 と表せる。
と は直交するので、

複数の点を通る直線のパラメータを求める
2 点 、 が同一直線上にあるとき、その直線が で表されるとすると、次を満たします。
したがって、- 空間の交点が 2 点を通る直線の のパラメータであることがわかります。
ハフ変換での利用
- 空間にビンを作成し、画像上の各特徴点を通る直線を該当するビンに投票します。値が大きいビンに該当する直線は複数の特徴点を通っているということがわかります。
コメント