答案 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)
然后我应用了一个简单的阈值来提取白线。或者,您可以申请,例如用于提取边缘的拉普拉斯滤波器,然而,简单的阈值处理将忽略例如网球场后面的水平线:
edges = smooth > 180
然后执行类似于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.5
和120
。总体结果: