如何使用霍夫变换来找到图像中的线条数量?

3
我无法通过霍夫变换获得图像中确切的行数。
我已经为图像找到了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


只需对图像进行阈值处理,然后使用 blob 和连通组件来计算所有黑色区域的数量。 - fmw42
我想要仅使用霍夫线。利用霍夫线的输出,我需要得到结果。这可能吗? - Nandu
你不能仅通过霍夫线计数。你需要获取轮廓或斑点并对它们进行计数。 - fmw42
你能为上面的图片做到并在实践中展示吗? - Nandu
请看下面的代码,由nathancy编写 - fmw42
2个回答

1

不必使用cv2.HoughLinesP(),更简单的方法是进行阈值处理并查找轮廓。在迭代cv2.findContours()时,您可以使用计数器跟踪线的数量。如果坚持使用cv2.HoughLinesP(),可以调整minLineLengthmaxLineGap参数以正确检测所需的线条。


阈值

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,但在你的情况下会是2。 - Nandu
在您的原始图像中,只有线条,因此此方法适用于仅具有线条的图像。如果图像中有其他形状,则可以查看其他方法(例如纵横比)以过滤形状。图像处理技术因图像而异,没有一种适用于所有图像的解决方案。 - nathancy

0

print(len(lines))是你使用的指令,可以给出Hough变换检测到的线条数量。在这个案例中,由于Hough变换可以找到邻近像素上间距非常接近的三条线,看起来就像是一条(长)线,因此数量为7(而不是5)。

要找出它们之间的差异:

要么用不同颜色绘制每条线,这样你就知道它们之间的区别了。

要么绘制每条线的x,y坐标,你就会知道它们之间的距离。

如果你想要更少的线,则需要在HoughLinesP函数中增加minLineLengthminimum threshold值。

希望对你有所帮助!


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