下面是我用来获取图像中人眼清晰可见的垂直线的代码。角度已设置为 3 弧度到 3.3 弧度,因此它只检测垂直线。我的另一个问题是如何正确检测线的端点。我尝试了 EqualizeHist 和 AdaptiveThreshold,但一切似乎都把我的形象搞砸了。
sobelx_c = cv2.Sobel(image,cv2.CV_8UC1,1,0,ksize=1)
minLineLength,maxLineGap = 30,5
lines = cv2.HoughLines(sobelx_c,1,np.pi/180,185,minLineLength,maxLineGap)
list_to_write = []
im = img.copy()
# norm_difference is to make sure similar lines dont get repeated.
def norm_difference(xs,ys):
return sum(abs(x-y) for x,y in zip(xs,ys)) > 5
if lines is not None:
for i in range(0, len(lines)):
rho = lines[i][0][0]
theta = lines[i][0][1]
if (theta<3.3 and theta>3):
var = [90 - np.rad2deg(theta),rho]
if all(norm_difference(var,other) for other in list_to_write):
list_to_write.append(var)
a = np.cos(theta)
b = np.sin(theta)
x0 = a * rho
y0 = b * rho
pt1 = (int(x0 + 1000*(-b)), int(y0 + 1000*(a)))
pt2 = (int(x0 - 1000*(-b)), int(y0 - 1000*(a)))
print(pt1 , pt2)
cv2.line(im,pt1,pt2,(0,255,0),3)
write_into_txt("lines.txt",list_to_write)
cv2.imwrite('lines.jpg',im)
这是图像: 在灰度图像中可以看到一条白色垂直线
不幸的是,这些是它在真实图像上检测到的线条: 正方形的边缘应该被检测为在 x 方向上使用了 sobel