如何使用霍夫变换查找图像中的行数?

时间:2019-07-29 08:50:05

标签: python image opencv image-processing hough-transform

我无法使用霍夫变换获得图像中出现的确切行数。

我已经找到了图像的houghLines,现在当使用hough lines映射的图像打印行数时,我无法获得确切的行数。

import cv2
import numpy as np
import matplotlib.pyplot as plt


img=cv2.imread('lines.png')

edges=cv2.Canny(img,0,150)


lines = cv2.HoughLinesP(edges, 2, 1*np.pi/180, 45, minLineLength=1, maxLineGap=1)



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


plt.imshow(img)
print(len(lines))

下图的预期输出为5,但实际输出为7:

input image

2 个答案:

答案 0 :(得分:1)

代替使用cv2.HoughLinesP(),一种更简单的方法是阈值确定轮廓。遍历cv2.findContours()时,可以使用计数器跟踪行数。如果您坚持使用cv2.HoughLinesP(),则可以使用 minLineLength maxLineGap 参数正确检测所需的行


阈值

enter image description here

检测到的线

enter image description here

结果

  

5

import cv2

image = cv2.imread('1.png')
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY_INV)[1]

cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

lines = 0
for c in cnts:
    cv2.drawContours(image, [c], -1, (36,255,12), 3)
    lines += 1

print(lines)
cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey()

答案 1 :(得分:0)

您使用的

print(len(lines))为您提供通过霍夫变换检测到的确切行数。在您的情况下,该数字是7(而不是5),因为霍夫变换可以在相邻像素中找到3条非常靠近的线,这使其看起来像一条(长)线。

为了找到区别:

以不同的颜色绘制每条线,然后您就会知道它们之间的区别

或者绘制每条线的x,y坐标,您知道它们有多近。

如果希望减少行数,则需要在 HoughLinesP 函数中使用更高的 minLineLength 最小阈值值。

希望有帮助!