- 1. 学习如何在你的电脑上配置OpenCV-Python环境!
- 1.1 开始了解OpenCV-Python
- 1.2 在 Windows 下安装 OpenCV-Python
- 1.3 在 Fedora 环境下安装 OpenCV-Python
- 1.4 在 Debian(Ubuntu)中配置 OpenCV-Python
- 1.5 在Docker中安装OpenCV-Python
- 1.6 在树莓派配置OpenCV-Python
- 2. OpenCV中的GUI功能
- 2.1 开始使用图像
- 2.2 开始使用视频
- 2.3 OpenCV 中的绘图函数
- 2.4 以鼠标为画笔
- 2.5 用滑块控制条做调色板
- 3. OpenCV中的GUI功能
- 3.1 图片基本操作
- 3.2 图像算术操作
- 3.3 性能评估与改进技巧
- 4. OpenCV中的图像处理
- 4.1 更换颜色空间
- 4.2 对图像进行几何变换
- 4.3 图像二值化处理
- 4.4 平滑图像
- 4.5 形态学转换
- 4.6 图像梯度
- 4.7 Canny边缘检测
- 4.8 图像金字塔
- 4.9.1 直方图:查找,绘制,分析
- 4.9.2 直方图均衡化
- 4.9.3 二维直方图
- 4.9.4 直方图反投影
- 4.10 OpenCV中的图像变换
- 4.10.1 傅立叶变换
- 4.11 模板匹配
- 4.12 霍夫直线变换
- 4.13 霍夫圆变换
- 4.14 基于分水岭算法的图像分割
- 4.14 使用 GrabCut 算法交互式前景提取
- 5. 特征检测和描述符
- 5.1 理解特征
- 5.2 Harris 角点检测
- 5.3 Shi-Tomasi 角点检测 & 适合用来跟踪的特征
- 5.4 介绍SIFT(尺度不变特征转换)
- 5.5 介绍SURF(加速稳健特征)
- 5.6 角点检测的FAST算法
- 5.7 BRIEF特征点描述算法
- 5.8 ORB 特征描述符(Oriented FAST and Rotated BRIEF)
- 5.9 特征匹配
- 5.10 特征匹配和使用单应性匹配来搜索物体
- 6. 视频分析
- 6.1 Meanshift和Camshift
- 6.2 光流
- 6.3 背景分割
- 7. 相机校准和3D重建
- 7.1 相机校准
- 7.2 姿势估计
- 7.3 极线几何
- 7.4 来自立体图像的深度图
- 8. 机器学习
- 8.1 K-最近邻算法
- 8.1.1 了解k-最近邻算法
- 8.1.2 使用kNN进行手写字符的OCR
- 8.2 支持向量机(SVM)
- 8.2.1 理解SVM
- 8.2.2 使用SVM的手写数据的OCR
- 8.3 K-Means聚类
- 8.3.1 理解 K-Means 聚类
- 8.3.2 OpenCV中的K-Means聚类
- 9. 计算摄影学
- 9.1 图像去噪
- 9.2 图像修复
- 9.3 高动态范围(HDR)
- 10. 目标检测
- 10.1 使用 Haar Cascades 的面部识别
- 11. OpenCV-Python 绑定
- 11.1 OpenCV-Python绑定如何工作?
4.12 霍夫直线变换
目标
- 我们将理解霍夫变换的概念。
- 我们将看到如何使用它来检测图像中的线条。
- 我们将看到以下函数:
cv2.HoughLines()
,cv2.HoughLinesP()
理论基础
霍夫变换是一种用来检测形状的流行的技术,如果你能以数学形式来表示这种形状的话。它可以检测到形状,即使它被破坏或扭曲了一点。我们将看到它是如何检测出一条线。
一条线可以表示为 $y = mx+c$,或以参数方程表示,$\rho = x \cos \theta + y \sin \theta$ 其中 $\rho$ 是从原点到线的垂直距离,$\theta$ 是这根直线与水平轴所形成的角度,角度是逆时针测量的(这个方向随您如何表示坐标系而变化,上面说的这个表示方法在OpenCV中使用)。
所以如果这条线在原点以下经过,它将有一个正的 $\rho$ 和一个小于 180 的角度。如果它在原点以上,这里不取大于180的角度,而是仍然取一个小于180的角度,但$\rho$取负值。垂直线是0度,水平线是90度。
现在让我们来看看霍夫变换是如何工作的。任何一条线都可以用这两个值来表示$(\rho, \theta)$。所以首先创建一个二维数组或者说累加器(来保存这两个参数的值),并将其设置为0。让行表示$\rho$,而列表示$\theta$。数组的大小取决于你需要的精度。假设你想要角度的准确度是1度,你将需要180列。对于$\rho$,可能的最大距离是图像的对角线长度。因此,以精度为一个像素为例,行数可以是图像的对角线长度。
考虑在水平线中间的100x100图像。看线上的第一点。你知道它的 $(x,y)$ 值。现在在行方程中,把值 $\theta = 0,1,2,…,180$ 带入,并检查你得到的 $\rho$。对于每个 $(\rho,\theta)$ 对,您在我们的累加器中的相应$(\rho,\theta)$单元格中将值递增1。所以现在在累加器中,单元 $(50,90)= 1$。
现在看线上的第二点。像上面一样做。递增对应于 $(\rho,\theta)$ 的单元格中的值。这一次,单元格$(50,90)= 2$。你实际上做的是对$(\rho,\theta)$值投票。继续对每一个点应用这个操作。在每个点上,单元格(50,90)的票数都会递增,而其他单元格可能会被投票或者不投票。这样,最后,单元(50,90)将获得最多的选票。因此,如果您搜索累加器获得最大的选票,您将得到值(50,90),即在该图像中距离原点50度,角度90度处有一条线。它在下面的动画中很好地显示(图片提供者:Amos Storkey)
这就是霍夫变换对线条的工作原理。这很简单,也许你可以使用Numpy自己实现它。以下是显示累加器的图像。某些位置的亮点表示它们是图像中可能线条的参数。 (图片提供者: 维基百科)
OpenCV 中的霍夫变换
上面解释的一切都封装在OpenCV函数cv2.HoughLines()
)中。它只是返回一个数组的$(\rho, \theta)$。 $\rho$以像素为单位进行测量,$\theta$以弧度测量。第一个参数是输入图像,应该是一个二值图像,所以在应用霍夫变换之前应用阈值或者使用canny边缘检测。第二和第三个参数分别是$\rho$和$\theta$精度。第四个参数是阈值,这意味着被视为一条线所需要的最低的投票。记住,得票数取决于线上的点数。所以它代表了应该检测到的线的最小长度。
@include hough_line_transform.py
概率霍夫变换
在霍夫变换中,即使对于有两个参数的行,也可以看到很多计算。概率霍夫变换是我们看到的霍夫变换的一个优化。它没有考虑到所有的要点。相反,它只需要一个随机子集,足以进行在线检测。只是我们必须降低门槛。请参阅下面的图像,比较霍夫空间中的霍夫变换和概率霍夫变换。 (图片提供者:Franck Bettinger的主页)
OpenCV的实现是基于Robust Detection of Lines Using the Progressive Probabilistic Hough Transform by Matas, J. and Galambos, C. and Kittler, J.V. @cite Matas00.。使用的函数是cv2.HoughLinesP()
。它有两个新的参数。
- minLineLength - 行的最小长度。比这更短的线段被拒绝。
- maxLineGap - 线段之间允许的最大间隔来处理它们
最好事情的是,它直接返回行的两个端点。 在前面的例子中,你只有线的参数,你必须找到所有的点。 在这里,一切都是直接和简单的。
@include probabilistic_hough_line_transform.py
更多资源
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论