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

7

我在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 Laplacian边缘检测的结果如下图所示: The edge detection results 而霍夫变换返回的结果只识别出一条线,如下图中绿线所示: Transformed Internet Bill 请问有谁可以帮我想出哪些代码修改才能识别账单上所有粗的水平/垂直线?

你能否也添加拉普拉斯边缘检测的结果作为图片呢?霍夫变换对参数非常敏感,必须在迭代中进行进一步优化。 - Nikolas Rieble
请在您的代码中添加图片导入和所使用的库导入,这样任何愿意帮助的人只需复制粘贴代码即可测试。 - Nikolas Rieble
1个回答

13

我觉得你只在以下代码中读取了"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设置得更低。


1
你好,我在将lines [0]替换为lines时遇到以下错误:for x1,y1,x2,y2 in lines: ValueError:未提供足够的值来分配(期望4个,得到1个)我从http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_houghlines/py_houghlines.html引用了此代码,因此我不确定如何解决此错误。我对此相当陌生。 - Anindita Bhowmik
@ Nikolas Rieble:你能指导我如何进一步从图像中删除已识别的线条吗?非常感谢你的帮助。 :) - Anindita Bhowmik
1
你的终极目标是什么?如果你只想“删除”这些行,你可以在原始图像上以被检测到的行的位置绘制白色线条。 - Nikolas Rieble

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接