0

下面是我用来获取图像中人眼清晰可见的垂直线的代码。角度已设置为 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

4

0 回答 0