返回
霍夫变换:线条和曲线的检测与拟合
开发工具
2024-02-01 15:17:09
霍夫变换的基础
霍夫变换的基本思想是将图像中每个点的梯度转换为极坐标系中的点。极坐标系中一点的坐标由极径和极角表示,极径是该点到原点的距离,极角是该点与水平轴的夹角。
通过将图像中每个点的梯度转换为极坐标系中的点,霍夫变换可以将线段和圆转换为参数空间中的一系列点。线段在参数空间中表现为一条直线,而圆在参数空间中表现为一个圆。
在OpenCV中使用霍夫变换
OpenCV提供了一系列函数来使用霍夫变换检测线段和圆。这些函数包括:
- cv.HoughLines(): 此函数用于检测线段。它接受一个边缘检测图像作为输入,并返回一个包含检测到的线段的列表。
- cv.HoughLinesP(): 此函数用于检测线段。它接受一个边缘检测图像作为输入,并返回一个包含检测到的线段的列表。与cv.HoughLines()不同的是,cv.HoughLinesP()使用概率霍夫变换来检测线段,这通常比霍夫变换更快、更准确。
- cv.HoughCircles(): 此函数用于检测圆。它接受一个边缘检测图像作为输入,并返回一个包含检测到的圆的列表。
实例:霍夫变换检测线段
import cv2
import numpy as np
# 读取图像
image = cv2.imread('image.jpg')
# 边缘检测
edges = cv2.Canny(image, 50, 100)
# 使用霍夫变换检测线段
lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 50, minLineLength=100, maxLineGap=10)
# 绘制检测到的线段
for line in lines:
x1, y1, x2, y2 = line[0]
cv2.line(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
# 显示图像
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
实例:霍夫变换检测圆
import cv2
import numpy as np
# 读取图像
image = cv2.imread('image.jpg')
# 边缘检测
edges = cv2.Canny(image, 50, 100)
# 使用霍夫变换检测圆
circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=100, minRadius=0, maxRadius=0)
# 绘制检测到的圆
for circle in circles[0]:
x, y, radius = circle
cv2.circle(image, (x, y), radius, (0, 255, 0), 2)
# 显示图像
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
结论
霍夫变换是一种用于检测线段、圆和其他几何形状的强大技术。它在图像处理和计算机视觉的许多领域中都有应用。在OpenCV中,可以使用cv.HoughLines()、cv.HoughLinesP()和cv.HoughCircles()函数来使用霍夫变换检测线段和圆。