如何只使用python和openCV检测此图像中的白色边框

时间:2018-01-16 16:51:54

标签: python opencv image-processing

tennis court

如何使用opencv python从上面的图像中单独检测白线? 我可以使用哪种方法?或者是否有任何内置功能可用于此目的?

霍夫在这个案子上表现不佳。 最终输出应该是这样的: lane enter image description here

1 个答案:

答案 0 :(得分:2)

看起来Hough's确实做得很好。我采用了显示here的示例,并仅对边缘的提取进行了一些小修改:

加载图片并转换为灰度:

import numpy as np
import cv2
import scipy.ndimage as ndi

img = cv2.imread(path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

然后我应用中值滤波器来消除图像中网络的一些高频边缘/噪声:

smooth = ndi.filters.median_filter(gray, size=2)

结果如下所示: enter image description here

然后我应用了一个简单的阈值来提取白线。或者,您可以申请,例如用于提取边缘的拉普拉斯滤波器,然而,简单的阈值处理将忽略例如网球场后面的水平线:

edges = smooth > 180

结果: enter image description here

然后执行类似于this示例的Hough线变换。

lines = cv2.HoughLines(edges.astype(np.uint8), 0.5, np.pi/180, 120)

for rho,theta in lines[0]:
    print(rho, theta)
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a*rho
    y0 = b*rho
    x1 = int(x0 + 1000*(-b))
    y1 = int(y0 + 1000*(a))
    x2 = int(x0 - 1000*(-b))
    y2 = int(y0 - 1000*(a))
    cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2)

# Show the result
cv2.imshow("Line Detection", img)

您可以使用精确度并修改结果。我最终选择了参数0.5120。总体结果:

enter image description here