即使图像在 Python 中的 OpenCV 中包含多行,霍夫线变换也只能识别一行

Posted

技术标签:

【中文标题】即使图像在 Python 中的 OpenCV 中包含多行,霍夫线变换也只能识别一行【英文标题】:Hough Line Transform identifies only one line even though image contains many lines in OpenCV in Python 【发布时间】:2016-11-14 10:58:02 【问题描述】:

我使用 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)

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

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

而霍夫线变换返回的结果仅识别出一条线,如下图绿线所示:

谁能帮我弄清楚需要对代码进行哪些修改才能识别 Internet Bill 的所有粗体水平/垂直线?

【问题讨论】:

可以把拉普拉斯边缘检测的结果也加成图片吗?霍夫变换对参数非常敏感,必须在迭代中进一步优化。 请在你的代码中添加图片的导入和你使用的库的导入,这样任何愿意帮助的人只需复制粘贴代码进行测试。 【参考方案1】:

在我看来,您只是在阅读“行”的第一个元素:

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 设置得较低。

【讨论】:

您好,我在用行替换行[0] 时收到此错误:对于行中的 x1,y1,x2,y2:ValueError: not enough values to unpack (expected 4, got 1) 我提到这段代码来自docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/…,所以我不确定如何解决这个错误。我对此很陌生。 @Nikolas Rieble:您能否指导我如何进一步从图像中删除已识别的线条?您的帮助将不胜感激。 :) 你的最终目标是什么?如果您只想“去除”线条,您可以在检测到线条的位置在原始图像上绘制白线。

以上是关于即使图像在 Python 中的 OpenCV 中包含多行,霍夫线变换也只能识别一行的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenCV 和 Python 识别数字

使用 OpenCV 和 Python 识别数字

Python,在标签中的 Tkinter 中显示 openCv 图像

OpenCV 中的鲁棒图像分割

[OpenCV-Python] OpenCV 中的图像处理 部分 IV (四)

[OpenCV-Python] OpenCV 中的图像处理 部分 IV (二)