ハフ変換は画像の中にある直線形状や円形状を検出する際に用いられる手法の一つ。opencvではHoughLinesという関数が用意されており、これを使うことで検出が容易となる(計算付加は指定するパラメータの精度により異なる)。
| HoughLines(image, lines, rho, theta, threshold, srn, stn) |
|---|
| 項目 | 内容 |
|---|---|
| image | 8ビット,シングルチャンネルの2値入力画像.この画像は関数により書き換えられる可能性がある |
| lines | 検出された直線が出力されるベクトル.各直線は,2要素のベクトル (rho, theta) で表現される. rho は原点(画像の左上コーナー)からの距離, theta はラジアン単位で表される直線の回転角度 |
| rho | ピクセル単位で表される投票空間の距離分解能 |
| theta | ラジアン単位で表される投票空間の角度分解能 |
| threshold | 投票の閾値パラメータ.十分な票を得た直線のみが出力される |
| srn | マルチスケールハフ変換において,距離分解能 rho の除数となる値.投票空間の粗い距離分解能は rho となり,細かい分解能は rho/srn となる.もし srn=0 かつ stn=0 の場合は,古典的ハフ変換が利用される.そうでない場合は,両方のパラメータが正値である必要がある |
| stn | マルチスケールハフ変換において,角度分解能 theta の除数となる値 |
■入力画像

■処理コード
import cv2
import numpy as np
img = cv2.imread('buil.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
lines = cv2.HoughLines(edges,1,np.pi/180,200)
for rho,theta in lines[0]:
a = np.cos(theta)
b = np.sin(theta)
x0 = a*rho
y0 = b*rho
x1 = int(x0 + 1000*(-b))
y1 = int(y0 + 1000*(a))
x2 = int(x0 - 1000*(-b))
y2 = int(y0 - 1000*(a))
cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2)
cv2.imshow("houghline",img)
cv2.waitKey(0)
cv2.destroyWindow()
■結果

