Hough 直线变换是一种在图像中检测直线的技术。它通过在极坐标空间中表示图像中的直线,将直线检测问题转换为参数空间的累加问题。OpenCV 提供了 cv2.HoughLines()
和 cv2.HoughLinesP()
函数来执行 Hough 直线变换。
cv2.HoughLines()
lines = cv2.HoughLines(image, rho, theta, threshold)
参数说明:
image
: 输入的二值图像,通常是通过边缘检测算法(如Canny)得到的。rho
: 极坐标中的像素距离精度。theta
: 极坐标中的角度精度,通常以弧度表示。threshold
: 累加平面中的阈值,只有累加值大于该阈值的直线才会被检测到。
返回值:
lines
: 检测到的直线的参数。每行表示检测到的一条直线,包括极径(rho)和角度(theta)。
cv2.HoughLinesP()
lines = cv2.HoughLinesP(image, rho, theta, threshold, minLineLength, maxLineGap)
除了上述参数外,cv2.HoughLinesP()
还包括以下两个参数:
minLineLength
: 最小直线长度,小于该长度的直线会被排除。maxLineGap
: 直线之间允许的最大间隙,小于该间隙的直线将被连接为一条直线。
以下是一个简单的示例,演示如何使用 Hough 直线变换检测图像中的直线:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像并转换为灰度
img = cv2.imread( r"C:\Users\mzd\Desktop\opencv\2.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 边缘检测
edges = cv2.Canny(gray, 50, 150)
# 执行 Hough 直线变换
lines = cv2.HoughLines(edges, 1, np.pi/180, 100)
# 在原图上绘制检测到的直线
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)
# 显示原图和检测到的直线
plt.figure(figsize=(10, 5))
plt.subplot(121), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('Original Image with Hough Lines'), plt.axis('off')
plt.subplot(122), plt.imshow(edges, cmap='gray')
plt.title('Canny Edge Detection'), plt.axis('off')
plt.show()
在这个示例中,我们首先读取了一幅图像,将其转换为灰度图像,然后使用Canny边缘检测算法得到图像的边缘。接着,使用 cv2.HoughLines()
函数进行 Hough 直线变换,并在原图上绘制检测到的直线。最后,通过 Matplotlib 显示原图和边缘检测结果。