2016-09-28 771 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