Hough 线变换仅识别一条线,即使图像在 Python 的 OpenCV 中包含多条线

Hough Line Transform identifies only one line even though image contains many lines in OpenCV in Python

我用OpenCV中的拉普拉斯变换做边缘检测,然后用霍夫线变换检测其中的直线。这些识别出的线条最终需要从图像中移除。

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('Feb_16-0.jpg',0)
kernel = np.ones((1,1),np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
blur = cv2.GaussianBlur(opening,(1,1),0)
ret3,th4 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) 
laplacian = cv2.Laplacian(th4,cv2.CV_8UC1)
cst = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
minLineLength = 100
maxLineGap = 10
lines = cv2.HoughLinesP(laplacian,1,np.pi/180,100,minLineLength,maxLineGap)
for x1,y1,x2,y2 in lines[0]:
    cv2.line(cst,(x1,y1),(x2,y2),(0,255,0),2)

cv2.imwrite('houghlines5.jpg',cst)

我希望找出法案中的所有行:

拉普拉斯边缘检测结果如下:

而 Hough Line Transform 返回的结果仅识别出一条线,如下图中的绿线所示:

谁能帮我弄清楚需要对代码进行哪些修改才能识别互联网法案中所有粗体 horizontal/vertical 行?

在我看来,您只是在阅读 "lines" 的第一个元素:

for x1,y1,x2,y2 in lines[0]:
    cv2.line(cst,(x1,y1),(x2,y2),(0,255,0),2)

因此,您只画了第一条(最重要的)线,它已被发现(最长、最粗)。我建议你试试:

for line in lines:    
    for x1,y1,x2,y2 in line:
         cv2.line(cst,(x1,y1),(x2,y2),(0,255,0),2)

此外,如果您仍然没有得到正确的结果,我建议将 minLineLength 设置得更低。