霍夫变换(opencv_python学习)
霍夫变换
- 霍夫线变换
- cv.HoughLines():
- cv.HoughLinesP():
- 一般霍夫线变换
- 概率霍夫线变换
- 霍夫圈变换
霍夫变换是一种常用的图像处理技术,用于检测图像中的直线、圆或其他形状。
霍夫线变换
解决霍夫变换用于检测图像中的直线问题。
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 * rhoy0 = b * rhox1 = 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)
霍夫变换(opencv_python学习)相关推荐
- 【opencv_python学习之二.五】如何查看opencv_python的函数说明
1.网上手册查询 A. 打开Welcome to opencv documentation B. 在左侧输入要查询的函数, 如图1.1,假设我们要查询resize函数 图 1.1 C. 点击Searc ...
- 开发者的自白_普通开发者的自白
开发者的自白 I've always been an average developer. Not bad, but nothing extraordinary. I worked at some r ...
- 【深度学习】实战教程 | 车道线检测项目实战,霍夫变换 新方法 Spatial CNN
此文按照这样的逻辑进行撰写.分享机器学习.计算机视觉的基础知识,接着我们以一个实际的项目,带领大家自己动手实践.最后,分享更多学习资料.进阶项目实战,这部分属于我CSDN上的专栏,最后会按照顺序给出相 ...
- OpenCV学习笔记(十三):霍夫变换:HoughLines(),HoughLinesP(),HoughCircles( )
OpenCV学习笔记(十三):霍夫变换:HoughLines(),HoughLinesP(),HoughCircles( ) 1.霍夫线变换HoughLines() OpenCV支持三种不同的霍夫线变 ...
- opencv学习(三十三)之霍夫变换
1.霍夫变换综述 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.主要用来从图像中分离出具有某种相同特征的几何形状.最基本的霍夫变换是从黑白图像中检测直线.在图像 ...
- 《OpenCV3编程入门》学习笔记7 图像变换(二 )霍夫变换
7.2 霍夫变换 7.2.1 概述 1.特征提取技术,运用两个坐标空间之间的变换将在一个空间中具有相同形状的曲线或直线映射到另一个坐标空间的一个点上形成峰值,从而把检测任意形状的问题转化为统计峰值问题 ...
- 深度学习和目标检测系列教程 20-300:OpenCV与图像处理:霍夫变换技术实现直线检测
@Author:Runsen 霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,该过程在一个參数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍夫变换结果. ...
- opencv学习-霍夫变换-圆检测
一.霍夫变换-圆检测 圆检测对噪声比较敏感,所以首先要对图像进行均值滤波 基于效率考虑,opencv中实现霍夫变换圆检测的步骤: 1.检测边缘,发现可能的圆心 2.基于第一步的基础上从候选圆心开始计算 ...
- OpenCV图像处理学习十八,霍夫变换实现交通车道线检测
一.霍夫变换 经典霍夫变换用来检测图像中的直线,后来霍夫变换经过扩展可以进行任意形状物体的识别,例如圆和椭圆.霍夫变换运用两个坐标空间之间的变换,将在一个空间中具有相同形状的曲线或直线映射到另一个坐标 ...
最新文章
- element ui 中el-input搜索输入框或者普通输入框无法输入的问题讨论
- Python能做什么事?为什么人工智能一定要学Python?
- QT的QDBusInterface类的使用
- 字典与文本文档的转换
- 身份反模式:联邦筒仓和意大利面条身份
- flex 有关数据类型强制转
- String s = new String(123) 究竟创建了几个对象
- android sdk64位资源,android SDK 有32位或64位的分别吗
- shiro学习笔记:remeberMe,多次登录锁死账号
- Amazon S3 API
- vue3.0 vuex 全局变量 存储更改
- android 异步加载图片缩略图
- 177.第N高的薪水
- python 批量word文档转pdf
- springmvc整合UReport2
- ABBYY FineReader OCR图片文字识别软件安装应用
- Dev c++中文乱码,codeblocks运行结果乱码解决办法
- java fact函数_Fact 定义一个类Fact表示无符号有理数(分数) 联合开发网 - pudn.com...
- LIME Low light Image Enhancement via Illumination Map Estimation
- 计算机基础知识与公文写作,公文写作与计算机基础知识
热门文章
- AWS云服务的架构方案
- android应用教程试题,ANDROID应用开发试题
- Python编程新手看过来,如何求素数 (Python学习教程
- honeyd模板配置文件的建立
- Python 基础 CSV文件的操作
- android的原型设计规范,Android设计规范 Material Design-Components(12滑块)
- [译] 漫画:深入浅出 ES 模块
- 【17】AMOLED屏幕子像素定位
- Compilation failed:internal java compiler error错误解决
- 充分利用笔记本的 USB-C 接口,不妨先换一个显示器,拒绝桌面线材凌乱