物理の駅 Physics station by 現役研究者

テクノロジーは共有されてこそ栄える

Python+OpenCVで確率的ハフ変換を用いた直線認識

f:id:onsanai:20191228012534p:plain:w200

  1. グレースケールで上記の画像を読み込む。
  2. 31x31のカーネルサイズのガウシアンフィルタをかける
  3. ガウシアンフィルタをかけた画像から元画像を引く
  4. しきい値 18 の処理をかける
  5. 確率的ハフ変換を行う
  6. 直線を描画する
# %%
import cv2
import numpy as np

img = cv2.imread("sample.png", cv2.IMREAD_GRAYSCALE)
dst = cv2.GaussianBlur(img, ksize=(31, 31), sigmaX=0)
sub = cv2.subtract(dst, img)
ret, thr = cv2.threshold(sub, thresh=18, maxval=1, type=cv2.THRESH_BINARY)
thr100 = thr*100

lines = cv2.HoughLinesP(thr, rho=1, theta=np.pi/180*2, threshold=30,
                        minLineLength=20, maxLineGap=5)

for line in lines:
    for x1, y1, x2, y2 in line:
        cv2.line(thr100, (x1, y1), (x2, y2), 255, 1)
cv2.imwrite("result.png", thr100)
cv2.imshow("Window", thr100)
cv2.waitKey(0)

f:id:onsanai:20191228012718p:plain:w200

cv2.HoughLinesP の引数は、threshold以降はデフォルト値をもつ引数になっている。

# 定義式
HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None)

threshold の直後はデフォルト値が設定された lines 引数で、キーワード指定をせずに以下のように記述すると、 minLineLength が5になってしまう。

# 間違い
lines = cv2.HoughLinesP(thr, 1, np.pi/180*2, 30, 20, 5)

C++の引数と異なり、かつ古いPython用のチュートリアルの記述が間違っているので、注意してほしい。