ハフ変換(OpenCV)で直線の取得に挑戦
OpenCV4.2で試してます。ハフ変換についての解説はこちら鳥取大学さんのサイト翻訳が役立つでしょうか。
ただ上記のサイトのコードはOpenCVバージョンが古いため最近のOpenCVでは誤作動しますので、OpenCVバージョンにあった使い方をしないとダメですね。
https://docs.opencv.org/4.2.0/d9/db0/tutorial_hough_lines.html
今回のターゲットはこちらの納税関連のPDFを画像化したものです。この画像の罫線部分の直線を取得してみるところまでやってみます。
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エッジも確認のため出力してみます。
こちらサンプルが綺麗で単純ということもありますが、ほとんどの直線がとれました。
正直線が取れるだけでは足りず、取得した線からセルを構成することが必要と思いますが、またそれは別の問題になりますので、いずれ試してみます。