为什么霍夫变换在有多条线时只产生一条线?

Why Does Hough Transform Only Produce One Lines When There's Multiple Lines?

我正在尝试使用霍夫变换来查找我需要的线条。我正在处理多张图片,其中一个例子是这张

https://i.stack.imgur.com/KmGdP.jpg

然而,当使用霍夫变换时,结果是

https://i.stack.imgur.com/DJvbg.jpg

我不知道为什么只有一条线在标志上结束,我希望 hough 线包含所有四个边,而对于其他图像,我有一些甚至没有出现 hough 线他们。我究竟做错了什么?是否有任何纠正措施?这是我 运行

的代码
import numpy as np
import cv2 as cv
import os

images = []
edges = []

light_range = (0, 0, 0)
dark_range = (80, 80, 80)

#Importing testing images
for i in os.listdir("Directional Signage/Train"):
    img = cv.imread(os.path.join("Directional Signage/Train", i))

    if img is None:
        print("Couldn't read this image" + str(i))
    else:
        images.append(img)


for i in range(0, len(images)):
    #Preprocessing 
    #mask = cv.inRange(images[i], light_range, dark_range)
    img = np.float32(images[i]) / 255.0

    gx = cv.Sobel(img, cv.CV_32F, 1, 0, ksize=1)
    gy = cv.Sobel(img, cv.CV_32F, 0, 1, ksize=1)

    mag, angle = cv.cartToPolar(gx, gy, angleInDegrees=True)
    gray = cv.cvtColor(mag,cv.COLOR_BGR2GRAY)
    gray = np.uint8(gray * 255.0)
    edges = cv.Canny(gray,50,150,apertureSize = 3)
    lines = cv.HoughLines(edges,2,np.pi/90,200)
    #edges.append(lines)

    for rho,theta in lines[0]:
        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))

        cv.line(images[i],(x1,y1),(x2,y2),(0,0,255),2)


for i in range(0, len(images)):
    cv.imshow("blobby " + str(i), images[i])

l = cv.waitKey(0)

你只是迭代一行 (lines[0]),所以很明显你从每张图片中得到一行,改为这样做:

[...]
    for line in lines:
        for rho,theta in line:
            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))

            cv.line(images[i],(x1,y1),(x2,y2),(0,0,255),2)
[...]

更新:现在我的整个图像都变红了,而不是一条红线
原因是,Hough 函数按优先级查找每一行。更可能是真实行的行位于列表的第一部分。
列表的前两行,也许就是你要找的,所以试试这个:

[...]
    for line in lines[:2]:
        for rho,theta in line:
            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))

            cv.line(images[i],(x1,y1),(x2,y2),(0,0,255),2)
[...]