ハフ変換(OpenCV)で直線の取得に挑戦

OpenCV4.2で試してます。ハフ変換についての解説はこちら鳥取大学さんのサイト翻訳が役立つでしょうか。

http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_houghlines/py_houghlines.html

ただ上記のサイトのコードはOpenCVバージョンが古いため最近のOpenCVでは誤作動しますので、OpenCVバージョンにあった使い方をしないとダメですね。

https://docs.opencv.org/4.2.0/d9/db0/tutorial_hough_lines.html

今回のターゲットはこちらの納税関連のPDFを画像化したものです。この画像の罫線部分の直線を取得してみるところまでやってみます。

sample_hough.png

cv2.HoughLines()とcv2.HoughLinesP()の2種類ありますが、ちょっとだけコードの短い HoughLinesP() を使ってみます。

実際に変更して試すパラメータはminLineLength とmaxLineGap を対象ターゲットごとに変更してみればよいと思います。

#HoughP.py

import cv2
import numpy as np

img = cv2.imread('sample_hough.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
cv2.imwrite('CannyEdges.png',edges)
minLineLength = 100
maxLineGap = 10
lines = cv2.HoughLinesP(edges,1,np.pi/180,threshold=100,minLineLength=minLineLength,maxLineGap=maxLineGap)

for  line in lines:
    x1,y1,x2,y2=line[0]
    cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)
cv2.imwrite('sample_hough_output_p.png',img)

また中間出力のCannyエッジも確認のため出力してみます。

CannyEdges.png

こちらサンプルが綺麗で単純ということもありますが、ほとんどの直線がとれました。

sample_hough_output_p.png

正直線が取れるだけでは足りず、取得した線からセルを構成することが必要と思いますが、またそれは別の問題になりますので、いずれ試してみます。

OpenCV

Posted by kitakantech