霍夫变换(Hough Transform)是一种在图像处理中用于检测直线、圆等形状的算法。它的基本思想是将图像中的每个像素点转换为参数空间中的一个点,然后在参数空间中寻找形状对应的峰值,从而得到形状的参数。
在霍夫变换中,直线的参数表示为极坐标系下的两个参数:ρ(rho)和θ(theta)。ρ表示直线到原点的距离,θ表示直线与x轴的夹角。对于每个图像中的边缘点,我们可以计算出它们到所有可能直线的ρ和θ值,然后在参数空间中进行累加。最终,参数空间中的峰值对应的ρ和θ值就是图像中的直线参数。
下面是一个简单的Python实现:
```python
import numpy as np
import cv2
def hough_lines(img, rho, theta, threshold):
# 获取图像的高度和宽度
height, width = img.shape[:2]
# 计算极坐标系下的ρ和θ的取值范围
max_rho = int(np.sqrt(height**2 + width**2))
max_theta = 180
# 构建参数空间
accumulator = np.zeros((max_rho, max_theta))
# 遍历图像中的所有边缘点
for y in range(height):
for x in range(width):
if img[y][x] > 0:
# 对于每个边缘点,计算它到所有可能直线的ρ和θ值
for t in range(max_theta):
r = int(x * np.cos(np.deg2rad(t)) + y * np.sin(np.deg2rad(t)))
accumulator[r][t] += 1
# 找到参数空间中的峰值
lines = []
for r in range(max_rho):
for t in range(max_theta):
if accumulator[r][t] > threshold:
# 将峰值对应的ρ和θ值转换为直线参数
a = np.cos(np.deg2rad(t))
b = np.sin(np.deg2rad(t))
x0 = a * r
y0 = b * r
x1 = int(x0 + 1000 * (-b))
y1 = int(y0 + 1000 * (a))
x2 = int(x0 - 1000 * (-b))
y2 = int(y0 - 1000 * (a))
lines.append(((x1, y1), (x2, y2)))
return lines
# 读取图像
img = cv2.imread('test.jpg', 0)
# 边缘检测
edges = cv2.Canny(img, 50, 150)
# 进行霍夫变换
lines = hough_lines(edges, 1, 1, 100)
# 在原图上绘制直线
for line in lines:
cv2.line(img, line[0], line[1], (0, 0, 255), 2)
# 显示结果
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在这个例子中,首先使用Canny算子进行边缘检测,然后调用hough_lines函数进行霍夫变换。函数的参数包括图像、ρ和θ的取值范围以及阈值。最后,我们在原图上绘制检测到的直线。