OpenCV 霍夫变换

本文介绍了OpenCV中的霍夫变换,包括霍夫直线变换的cv2.HoughLines()和cv2.HoughLinesP()函数,以及霍夫圆变换的cv2.HoughCircles()函数。详细阐述了各个函数的参数和使用示例。

文章目录

一、霍夫直线变换
1. cv2.HoughLines()
1. cv2.HoughLinesP()
二、霍夫圆环变化


        霍夫变化是一种在图像中寻找直线、圆形以及其他简单形状的方法。霍夫变换采用类似于投票的方式来获取当前图像内的形状集合,该变换由 Paul Hough(霍夫)1962 年首次提出。最初霍夫变换只能用于检测直线,经过发展后,霍夫变换不仅能识别直线,还能识别其他简单的图形结构,常见的有圆、椭圆等。
一、霍夫直线变换

    OpenCV 提供了函数 cv2.HoughLines()和函数 cv2.HoughLinesP()用来实现霍夫直线变换。

1. cv2.HoughLines()

    OpenCV 提供了函数 cv2.HoughLines() 用来实现霍夫直线变换,该函数要求所操作的源图像是一个二值图像,所以在进行霍夫变换之前要先将源图像进行二值化,或者进行 Canny 边缘检测。

函数 cv2.HoughLines() 的语法格式为:

    lines = cv2.HoughLines(image, rho, theta, threshold)

▪ image 是输入图像,即源图像,必须是8位的单通道二值图像。如果是其他类型的图像,再进行霍夫变换之前,需要将其修改为指定格式
▪ rho 为以像素为单位的距离r的进度。一般情况下,使用的进度是1
▪ theta 为角度θ的精度。一般情况下,使用的精度是π/180,表示要搜索所有可能的角度
▪ threshold 是阈值。阈值越小,就会得到较多的直线;阈值较大,就会得到较小的直线
▪ 返回值 lines 中的每一个元素都是一对浮点数,表示检测到的直线的参数,即(r,θ),是numpy.ndarray类型

   函数cv2.Houg

### OpenCV 霍夫变换使用方法 #### 函数介绍 在 OpenCV 中,霍夫变换用于检测图像中的几何形状。对于直线检测,主要使用的函数是 `cv2.HoughLines()` 和 `cv2.HoughLinesP()`;而对于圆的检测,则采用 `cv2.HoughCircles()`。 - **霍夫直线变换** 对于标准霍夫线变换 (Standard Hough Line Transform),`cv2.HoughLines()` 可以用来识别二值化边缘图中的直线[^2]。 - **概率霍夫线变换** 更常用的是概率霍夫线变换 (`Probabilistic Hough Line Transform`) 即 `cv2.HoughLinesP()`,它只返回满足条件的一系列短直线段而不是完整的无限长度线条,这有助于减少计算量并提高效率[^3]。 - **霍夫圆变换** 圆形检测则依赖于 `cv2.HoughCircles()` 函数,此函数内部集成了 Canny 边缘检测器来寻找可能属于圆周上的点,并应用霍夫投票机制确定最终的圆形位置和半径[^1]。 #### 参数说明 这些函数都接受多个参数控制检测过程: - `image`: 输入图片应为8位单通道(灰度)二值图像; - `rho`, `theta`: 定义累加平面分辨率; - `threshold`: 设置多少票数以上的候选者才能被认定为目标对象; - `minLineLength`(仅限`HoughLinesP`) : 最小线段长度; - `maxLineGap`(仅限`HoughLinesP`) :允许的最大间隙宽度; - `param1`, `param2`(仅限`HoughCircles`):分别为传递给内嵌Canny算子的高阈值以及中心检测阶段的累积器阈值等。 #### 实际操作案例展示 ##### 检测直线的例子 下面给出一段Python代码片段演示如何利用OpenCV执行简单的霍夫直线变换: ```python import numpy as np import cv2 def hough_line_transform(image_path): img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) edges = cv2.Canny(img, 50, 150) lines = cv2.HoughLines(edges, rho=1, theta=np.pi / 180, threshold=200) result_img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) 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)) cv2.line(result_img, (x1,y1), (x2,y2),(0,0,255),2) hough_line_transform('path_to_image') ``` ##### 检测圆形的例子 这里也提供了一个关于霍夫圆变换的小例子: ```python def hough_circle_transform(image_path): img = cv2.imread(image_path, cv2.IMREAD_COLOR) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) circles = cv2.HoughCircles(gray,cv2.HOUGH_GRADIENT,dp=1,minDist=20,param1=50,param2=30,minRadius=0,maxRadius=0) output = img.copy() if circles is not None: circles = np.uint16(np.around(circles)) for i in circles[0,:]: center = (i[0], i[1]) radius = i[2] # Draw circle outline and its center point on the image. cv2.circle(output,center,radius,(0,255,0),2) cv2.circle(output,center,2,(0,0,255),3) hough_circle_transform('path_to_image') ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值