画像に単純なグリッドがあり、6x6、12x12 などのグリッド サイズを決定しようとしています。Python と cv2 を使用します。
上記の 3x3 グリッドでテストしています。画像内でそれらを検出して、垂直線/水平線の数を数えることでグリッド サイズを決定することを計画していました。
import cv2
import numpy as np
im = cv2.imread('photo2.JPG')
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
imgSplit = cv2.split(im)
flag,b = cv2.threshold(imgSplit[2],0,255,cv2.THRESH_OTSU)
element = cv2.getStructuringElement(cv2.MORPH_CROSS,(1,1))
cv2.erode(b,element)
edges = cv2.Canny(b,150,200,3,5)
while(True):
img = im.copy()
lines = cv2.HoughLinesP(edges,1,np.pi/2,2, minLineLength = 620, maxLineGap = 100)[0]
for x1,y1,x2,y2 in lines:
cv2.line(img,(x1,y1),(x2,y2),(0,255,0),1)
cv2.imshow('houghlines',img)
if k == 27:
break
cv2.destroyAllWindows()
以下に示すように、私のコードは行を検出しますが、画像の各行に対して複数の行が検出されます。
(画像のすべての行に対して 1px の緑の線が 2 本描かれています)
(グリッドのサイズによっては) 1 本の線だけが描画される場合があるため、単純に線の数を 2 で割ることはできません。
元の画像で検出されたすべての線をより正確に検出して 1 本の線を描画するにはどうすればよいですか?
しきい値設定を微調整して、画像を白黒に縮小しましたが、それでも複数の線が表示されます。これはキャニーエッジ検出のせいだと思いますか?