1

下の画像では、水平線は非常によく認識できていますが、垂直線はあまりうまく認識されていません。特に、グリッドの中央の線がまったく表示されておらず、横の線が過剰に描画されています (つまり、互いに接続されています)。

これを作成したコードは次のとおりです。

img = cv2.imread('./p6.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
threshhold, threshhold_img = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
edges = cv2.Canny(threshhold_img, 150, 200, 3, 5)
lines = cv2.HoughLinesP(edges,1,np.pi/180,500, minLineLength = 600, maxLineGap = 75)[0].tolist()

for x1,y1,x2,y2 in lines:
    cv2.line(img,(x1,y1),(x2,y2),(0,255,0),1)

さまざまなパラメーターを調整すると、真ん中の垂直線 (表の直前で終わる線JEXXY) が下から 3 番目のグリッドの上まで伸びているような状況になります。yi最初の 3 つのグリッドの上部にある,erを表すものを含め、ほぼすべての線が描画されるようにパラメーターを緩和しない限りsan、グリッドの内部を定義する中央の垂直線をコードで確認することはできません。

どうすればこれを修正できますか?

ハフ線を引いた画像

*キャニーなしでTHRESH_BINARY_INVを使用するように更新*

img = cv2.imread('./p6.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
threshhold, threshhold_img = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV)
lines = cv2.HoughLinesP(edges,1,np.pi/180,500, minLineLength = 600, maxLineGap = 75)[0].tolist()

for x1,y1,x2,y2 in lines:
    cv2.line(img,(x1,y1),(x2,y2),(0,255,0),1)

THRESH_BINARY_INVを使用したthreshold_imgの中間画像

THRESH_BINARY_INVを実行した後、これは行の出力です

* 更新: BINARY と OTSU を使用してしきい値画像を追加 *

THRESH_BINARY + THRESH_OTSU の threshold_img

4

1 に答える 1

3

あなたの場合、いくつかの行が他の行から投票を「盗む」ことなく、水平線と垂直線の両方を同時に作成する一連のパラメーターを見つけるのは非常に難しいと思います。ここで簡単なトリックを実行して、後で支配的な水平線に焦点を当てながら、垂直線のみの検出を強制することができます。

# Vertical lines
lines = cv2.HoughLinesP(
    threshhold_img, 1, np.pi, threshold=100, minLineLength=100, maxLineGap=1)

# Horizontal lines
lines2 = cv2.HoughLinesP(
    threshhold_img, 1, np.pi / 2, threshold=500, minLineLength=500, maxLineGap=1)

それは私に与える:

ここに画像の説明を入力

于 2015-06-14T20:08:32.053 に答える