2016-09-28 776 views
5

我試圖獲得校準棋盤的閾值。我不能直接檢測棋盤角落,因爲我觀察到微棋盤時有灰塵。 我嘗試了幾種方法,HoughLinesP似乎是最簡單的方法。但結果並不好,如何改善我的結果?Python如何用HoughLines和OpenCV檢測圖像中的垂直和水平線?

import numpy as np 
import cv2 

img = cv2.imread('lines.jpg') 
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
edges = cv2.Canny(gray,50,150,apertureSize = 3) 
print img.shape[1] 
print img.shape 
minLineLength=100 
lines = cv2.HoughLinesP(image=edges,rho=0.02,theta=np.pi/500, threshold=10,lines=np.array([]), minLineLength=minLineLength,maxLineGap=100) 

a,b,c = lines.shape 
for i in range(a): 
    cv2.line(img, (lines[i][0][0], lines[i][0][1]), (lines[i][0][2], lines[i][0][3]), (0, 0, 255), 3, cv2.LINE_AA) 
    cv2.imwrite('houghlines5.jpg',img) 

正如你可以在下面的圖中看到的,我不能得到我的棋盤,該線路在很多方向上的繪製...(原始圖片:https://s22.postimg.org/iq2b91xq9/droite_Image_00000.jpg

enter image description here

+0

使用閾值,或儘量減少小分(侵蝕,擴張)。 – linusg

+0

我已經嘗試過,但沒有加上hough線。也許這可能有助於獲得線條?感謝您的hellp;) – user3601754

+0

我真的會thresholding再次嘗試! – linusg

回答

15

您對rho使用的值太小。

試試下面的代碼: -

import numpy as np 
import cv2 

gray = cv2.imread('lines.jpg') 
edges = cv2.Canny(gray,50,150,apertureSize = 3) 
cv2.imwrite('edges-50-150.jpg',edges) 
minLineLength=100 
lines = cv2.HoughLinesP(image=edges,rho=1,theta=np.pi/180, threshold=100,lines=np.array([]), minLineLength=minLineLength,maxLineGap=80) 

a,b,c = lines.shape 
for i in range(a): 
    cv2.line(gray, (lines[i][0][0], lines[i][0][1]), (lines[i][0][2], lines[i][0][3]), (0, 0, 255), 3, cv2.LINE_AA) 
    cv2.imwrite('houghlines5.jpg',gray) 

注意,在RHO值,PI值和maxLineGap的變化,以減少異常值。

輸入圖像 Input Image

邊緣圖像 Edges Image

輸出圖像 Output Image

+0

如何保存圖像沒有紅線?我想要沒有所有線條的圖像。謝謝 – Link

+1

@Link - 我不確定圖像中沒有線條的意思。如果只需要輸出原始圖像,只需在繪製虛線之前使用'cv2.imwrite('imagename.jpg',gray)',即在運行命令'cv2.line'並在循環外部使用'imwrite'之前。 – saurabheights

0

我寧願寫這個評論,但不幸的是,我不能。你應該改變minLineLength和minLineGap。或者如果它只是你需要找到的方位,我會得到所有的線,並檢查它們之間的角度,以便只沿着正方形得到線。我之前和HoughLineP一起工作過,它基於上述兩個參數。另外,嘗試使用雙邊過濾。當使用中值濾波器進行銳化無助於我時,我確實很有幫助。

Bilateral Filter

-1
在圖像

處理,他們有一些角色你必須通過這樣去如過濾器,你去邊沿檢測之前,在你的病情的灰塵只是,你必須通過過濾器去除噪聲,使用gausse或之後使用閾值,然後使用canny邊緣和opencv他們是角質檢測,你可以使用,或者你可以去閾值後,如果我沒有錯的關鍵點..嘗試做這些步驟,看到resulte