5

画像に単純なグリッドがあり、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 本の線を描画するにはどうすればよいですか?

しきい値設定を微調整して、画像を白黒に縮小しましたが、それでも複数の線が表示されます。これはキャニーエッジ検出のせいだと思いますか?

4

3 に答える 3

10

行を繰り返し処理し、互いに 10px 以内にある行を削除しました。

lines = cv2.HoughLinesP(edges,1,np.pi/180,275, minLineLength = 600, maxLineGap = 100)[0].tolist()

for x1,y1,x2,y2 in lines:
    for index, (x3,y3,x4,y4) in enumerate(lines):

        if y1==y2 and y3==y4: # Horizontal Lines
            diff = abs(y1-y3)
        elif x1==x2 and x3==x4: # Vertical Lines
            diff = abs(x1-x3)
        else:
            diff = 0

        if diff < 10 and diff is not 0:
            del lines[index]

gridsize = (len(lines) - 2) / 2
于 2013-09-28T13:58:49.853 に答える
1

画像を拡張して kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (2, 2)) dilated = cv2.dilate(edges, kernel, iterations=5) から cv2.HoughLinesP を適用できます

于 2017-04-27T16:28:24.370 に答える