霍夫变换是一种常用的图像处理技术,用于检测图像中的直线、圆或其他形状。
霍夫线变换
解决霍夫变换用于检测图像中的直线问题。
OpenCV提供了两种执行霍夫变换检测直线的函数:cv.HoughLines() 和 cv.HoughLinesP()。
cv.HoughLines():
这个函数用于检测二值化图像中的直线。它的调用方式如下:
lines = cv.HoughLines(image, rho, theta, threshold)
- image 是输入的二值化图像。
- rho 和 theta 是霍夫空间中的极坐标参数分辨率。
- threshold 是用于判定一条直线是否被检测到的阈值。
该函数返回一个包含检测到的直线参数(ρ 和 θ)的数组。你可以使用这些参数来绘制直线。
cv.HoughLinesP():
这个函数与cv.HoughLines()类似,但是它可以在输入的图像中检测到线段而不仅仅是直线。其调用方式如下:
lines = cv.HoughLinesP(image, rho, theta, threshold, minLineLength, maxLineGap)
- image 是输入图像。
- rho 和 theta 是霍夫空间中的极坐标参数分辨率。
- threshold 是用于判定一条线段是否被检测到的阈值。
- minLineLength 是允许被检测到的线段的最小长度。
- maxLineGap 是被视为同一线段的两个线段之间的最大间隙。
该函数返回一个包含检测到的线段的数组,每个线段由其两个端点坐标(x1, y1)和(x2, y2)表示。
在使用这两个函数之前,通常需要先对图像进行预处理,如二值化处理、边缘检测等,以便提供给霍夫变换函数。
一般霍夫线变换
import numpy as np
import cv2 as cv
# 读取图像
img = cv.imread('pic1.jpg')
# 将图像转为灰度图像
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 获取图像尺寸
rows, cols = gray.shape
# 边缘检测
edges = cv.Canny(gray, 50, 150, apertureSize=3)
# 执行霍夫变换检测直线
lines = cv.HoughLines(edges, 1, np.pi/180, 200)
# 绘制检测到的直线
if lines is not None:
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))
cv.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
# 显示结果
cv.imwrite('pic.jpg', img)
cv.waitKey(0)
cv.destroyAllWindows()
概率霍夫线变换
当图像中存在大量噪声、部分遮挡或直线不明显时,传统霍夫变换可能会出现一些问题。为了解决这些问题,可以使用概率霍夫变换(Probabilistic Hough Transform)。
概率霍夫变换是一种改进的霍夫变换方法,它不仅能检测直线,还可以估计直线的起点和终点。相比于传统霍夫变换,概率霍夫变换的计算速度更快,因为它只对部分边缘点进行投票。
# 执行概率霍夫变换检测直线
lines = cv.HoughLinesP(edges, 1, np.pi/180, threshold=100, minLineLength=50, maxLineGap=10)
# 绘制检测到的直线
if lines is not None:
for line in lines:
x1, y1, x2, y2 = line[0]
cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
霍夫圈变换
cv.HoughCircles() 函数是 OpenCV 中用于执行霍夫圆变换的函数。该函数可用于在图像中检测圆形对象。
函数原型如下:
circles = cv.HoughCircles(image, method, dp, minDist, param1, param2, minRadius, maxRadius)
参数说明:
- image:输入的8位单通道灰度图像。
- method:指定霍夫圆变换的方法,一般使用 cv.HOUGH_GRADIENT。
- dp:累加器分辨率与图像分辨率的倒数的比例。常用的取值范围是 1 到 10 之间。
- minDist:检测到的圆之间的最小距离,如果两个圆间的距离小于此值,则会将其视为同心圆。
- param1:可以根据图像特性调整的第一个处理参数。
- param2:可以根据图像特性调整的第二个处理参数。
- minRadius 和 maxRadius:要检测的圆的最小和最大半径。
返回值:
-
circles:包含检测到的圆的信息的 Numpy 数组。每个圆由三个值构成:圆心的 x 坐标、圆心的 y 坐标和半径。
注意事项: -
cv.HoughCircles() 函数对于噪声敏感,因此在应用之前可能需要进行图像预处理,例如降噪、平滑化或调整图像对比度。
调整参数 minDist、param1、param2、minRadius 和 maxRadius 可能需要根据具体图像场景进行调试。
# 霍夫圆变换
circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=30, param1=50, param2=30, minRadius=0, maxRadius=0)
# 绘制检测到的圆
if circles is not None:
circles = np.round(circles[0, :]).astype("int")
for (x, y, r) in circles:
cv.circle(img, (x, y), r, (0, 255, 0), 2)