Python Hough变换检测直线的实现方法
Hough 变换是一种在图像处理中常用的技术,可以用来检测直线等形状,它的基本思路是将直角坐标系中的点映射到极坐标系中,在极坐标系中,一条直线对应着一个点,在极坐标系中检测直线等形状比在直角坐标系中更方便。python 提供了很多库可以实现 Hough 变换检测直线,本文将介绍其中的 hough_lines 和 hough_lines_p 两个函数的用法。
安装
在使用之前,需要在python中安装相应的库,其中最重要的是 OpenCV 库,在终端中输入以下命令可以安装 OpenCV 库,其它库都可以通过pip命令安装:
pip install opencv-python numpy matplotlib
hough_lines
基本方法
hough_lines 函数可以直接通过 OpenCV 库的 cv2.HoughLines() 调用。这个函数的主要参数是二值化后的图像,第二个参数是ρ 的精度,第三个参数是θ 的精度。ρ 是指从原点到直线的垂线距离,θ 是直线与 x 轴正方向的直线夹角,第四个参数是阈值,即检测到的直线的数量。
import cv2
import numpy as np
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
lines = cv2.HoughLines(edges,1,np.pi/180,200)
for line in lines:
rho,theta = line[0]
a = np.cos(theta)
b = np.sin(theta)
x0 = a*rho
y0 = b*rho
x1 = int(x0 + 1000*(-b))
y1 = int(y0 + 1000*(a))
x2 = int(x0 - 1000*(-b))
y2 = int(y0 - 1000*(a))
cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2)
cv2.imshow('Edges',edges)
cv2.imshow('Result',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
这个功能非常简单,以下是对代码的解释。首先进行 Canny 边缘检测,并将图像转换为灰度图像:
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
然后使用 cv2.HoughLines() 检测图像中的直线:
lines = cv2.HoughLines(edges,1,np.pi/180,200)
其中,第一个参数 edges 是一张二值化过的图像, 二值化后的灰度图像所显示的所有边缘都被运算了 Hough 变换,第二个和第三个参数分别代表单位长度的精度,在这里以像素为单位。第四个参数是在 滤波阈值内检测出来的直线才会被绘制,这个参数越大, 要求的线段就越为明显,如果滤波阈值是一个极小值(比如 20), 使用其他图片时就极少会检测出线段。
接下来,使用 for 循环遍历找到的每条直线,然后将其显示在原图上:
for line in lines:
rho,theta = line[0]
a = np.cos(theta)
b = np.sin(theta)
x0 = a*rho
y0 = b*rho
x1 = int(x0 + 1000*(-b))
y1 = int(y0 + 1000*(a))
x2 = int(x0 - 1000*(-b))
y2 = int(y0 - 1000*(a))
cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2)
最后,使用 cv2.imshow() 将两张图像显示出来:
cv2.imshow('Edges',edges)
cv2.imshow('Result',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
示例
在这个示例中,我们将运行上面的代码来检测一张图像中的直线。
假设我们有一张名为 test.jpg 的图片,其中包含了几条直线,我们将这张图像指定给第一行代码中的 imread() 函数。运行程序之后,它将显示出原始图像,以及用线段显示出检测到的直线的图像。
hough_lines_p
基本方法
hough_lines_p 函数是 OpenCV 库中的另外一个实现 Hough 变换检测直线的函数。在使用 hough_lines_p 函数中,不需要特殊指定斜率和截距的范围,它可以自动调整大小,以确定最佳 Hough 线条的数量。
import cv2
import numpy as np
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
minLineLength = 100
maxLineGap = 10
lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)
for line in lines:
x1,y1,x2,y2 = line[0]
cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)
cv2.imshow('Edges',edges)
cv2.imshow('Result',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
以下是对代码的解释。首先,我们进行 Canny 边缘检测并使用 cv2.HoughLinesP() 检测图像中的直线:
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
minLineLength = 100
maxLineGap = 10
lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)
其中,第二和第三个参数是距离精度和角度精度。 第四个参数是最小直线长度,第五个参数是用于网络连接确定线段的最大允许间距。
最后,使用 for 循环遍历找到的每条直线,然后将其显示在原图上:
for line in lines:
x1,y1,x2,y2 = line[0]
cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)
最后,使用 cv2.imshow() 将两张图像显示出来:
cv2.imshow('Edges',edges)
cv2.imshow('Result',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
示例
在这个示例中,我们将运行上面的代码来检测一张图像中的直线。
假设我们有一张名为 test.jpg 的图像,其中包含了几条直线,我们将这张图像指定给第一行代码中的 imread() 函数。运行程序之后,它将显示出原始图像以及用线段显示出检测到的直线的图像。
以上就是 Hough 变换检测直线的两种 python 实现方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python hough变换检测直线的实现方法 - Python技术站