在图像处理和计算机视觉领域中,如何从当前的图像中提取所需要的特征信息是图像识别的关键所在。在许多应用场合中需要快速准确地检测出直线或者圆。其中一种非常有效的解决问题的方法是霍夫(Hough)变换,其为图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。最基本的霍夫变换是从黑白图像中检测直线(线段)。

1、霍夫变换

⑴霍夫变换概述

霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍夫变换结果。

霍夫变换于1962年由PaulHough首次提出,最初的Hough变换是设计用来检测直线和曲线,起初的方法要求知道物体边界线的解析方程,但不需要有关区域位置的先验知识。这种方法的一个突出优点是分割结果的Robustness,即对数据的不完全或噪声不是非常敏感。然而,要获得描述边界的解析表达常常是不可能的。后于1972年由Richard Duda & Peter Hart推广使用,经典霍夫变换用来检测图像中的直线,后来霍夫变换扩展到任意形状物体的识别,多为圆和椭圆。霍夫变换运用两个坐标空间之间的变换将在一个空间中具有相同形状的曲线或直线映射到另一个坐标空间的一个点上形成峰值,从而把检测任意形状的问题转化为统计峰值问题。

⑵霍夫线变换

我们知道,霍夫线变换是一种用来寻找直线的方法. 在使用霍夫线变换之前, 首先要对图像进行边缘检测的处理,也即霍夫线变换的直接输入只能是边缘二值图像.

OpenCV支持三种不同的霍夫线变换,它们分别是:

●标准霍夫变换(Standard Hough Transform,SHT)

●多尺度霍夫变换(Multi-Scale Hough Transform,MSHT)

●累计概率霍夫变换(Progressive Probabilistic Hough Transform ,PPHT)。

其中,多尺度霍夫变换(MSHT)为经典霍夫变换(SHT)在多尺度下的一个变种。累计概率霍夫变换(PPHT)算法是标准霍夫变换(SHT)算法的一个改进,它在一定的范围内进行霍夫变换,计算单独线段的方向以及范围,从而减少计算量,缩短计算时间。之所以称PPHT为“概率”的,是因为并不将累加器平面内的所有可能的点累加,而只是累加其中的一部分,该想法是如果峰值如果足够高,只用一小部分时间去寻找它就够了。这样猜想的话,可以实质性地减少计算时间。

在OpenCV中,我们可以用HoughLines函数来调用标准霍夫变换SHT和多尺度霍夫变换MSHT。

而HoughLinesP函数用于调用累计概率霍夫变换PPHT。累计概率霍夫变换执行效率很高,所有相比于HoughLines函数,我们更倾向于使用HoughLinesP函数。

总结一下,OpenCV中的霍夫线变换有如下三种:

<1>标准霍夫变换(StandardHough Transform,SHT),由HoughLines函数调用。

<2>多尺度霍夫变换(Multi-ScaleHough Transform,MSHT),由HoughLines函数调用。

<3>累计概率霍夫变换(ProgressiveProbabilistic Hough Transform,PPHT),由HoughLinesP函数调用。

⑶霍夫线变换的原理

【1】众所周知, 一条直线在图像二维空间可由两个变量表示. 如:

<1>在笛卡尔坐标系: 可由参数: 斜率和截距(m,b) 表示。

<2>在极坐标系: 可由参数: 极径和极角

对于霍夫变换, 我们将采用第二种方式极坐标系来表示直线. 因此, 直线的表达式可为:

化简便可得到:

【2】一般来说对于点

, 我们可以将通过这个点的一族直线统一定义为:

这就意味着每一对

代表一条通过点

的直线。

【3】如果对于一个给定点

我们在极坐标对极径极角平面绘出所有通过它的直线, 将得到一条正弦曲线. 例如, 对于给定点X_0= 8 和Y_0= 6 我们可以绘出下图 (在平面):

这三条曲线在平面相交于点 (0.925, 9.6), 坐标表示的是参数对

或者是说点

, 点

和点

组成的平面内的的直线。

【5】以上的说明表明,一般来说, 一条直线能够通过在平面

寻找交于一点的曲线数量来检测。而越多曲线交于一点也就意味着这个交点表示的直线由更多的点组成. 一般来说我们可以通过设置直线上点的阈值来定义多少条曲线交于一点我们才认为检测到了一条直线。

【6】这就是霍夫线变换要做的. 它追踪图像中每个点对应曲线间的交点. 如果交于一点的曲线的数量超过了阈值, 那么可以认为这个交点所代表的参数对

在原图像中为一条直线。

2、霍夫圆变换

霍夫圆变换的基本原理和上面讲的霍夫线变化大体上是很类似的,只是点对应的二维极径极角空间被三维的圆心点x, y还有半径r空间取代。说“大体上类似”的原因是,如果完全用相同的方法的话,累加平面会被三维的累加容器所代替:在这三维中,一维是x,一维是y,另外一维是圆的半径r。这就意味着需要大量的内存而且执行效率会很低,速度会很慢。

对直线来说, 一条直线能由参数极径极角

表示. 而对圆来说, 我们需要三个参数来表示一个圆, 也就是:

这里的 表示圆心的位置 (下图中的绿点) 而 r 表示半径, 这样我们就能唯一的定义一个圆了, 见下图:

在OpenCV中,我们一般通过一个叫做“霍夫梯度法”的方法来解决圆变换的问题。

⑴霍夫梯度法的原理

【1】首先对图像应用边缘检测,比如用canny边缘检测。

【2】然后,对边缘图像中的每一个非零点,考虑其局部梯度,即用Sobel()函数计算x和y方向的Sobel一阶导数得到梯度。

【3】利用得到的梯度,由斜率指定的直线上的每一个点都在累加器中被累加,这里的斜率是从一个指定的最小值到指定的最大值的距离。

【4】同时,标记边缘图像中每一个非0像素的位置。

【5】然后从二维累加器中这些点中选择候选的中心,这些中心都大于给定阈值并且大于其所有近邻。这些候选的中心按照累加值降序排列,以便于最支持像素的中心首先出现。

【6】接下来对每一个中心,考虑所有的非0像素。

【7】这些像素按照其与中心的距离排序。从到最大半径的最小距离算起,选择非0像素最支持的一条半径。8.如果一个中心收到边缘图像非0像素最充分的支持,并且到前期被选择的中心有足够的距离,那么它就会被保留下来。

这个实现可以使算法执行起来更高效,或许更加重要的是,能够帮助解决三维累加器中会产生许多噪声并且使得结果不稳定的稀疏分布问题。

人无完人,金无足赤。同样,这个算法也并不是十全十美的,还有许多需要指出的缺点。

原文:https://www.cnblogs.com/zhuifeng-mayi/p/9569391.html

缺点 霍夫圆_霍夫线变换,霍夫圆变换相关推荐

  1. OpenCV之imgproc 模块. 图像处理(3)霍夫线变换 霍夫圆变换 Remapping 重映射 仿射变换

    霍夫线变换 目标 在这个部分您将学习到: 使用OpenCV的以下函数 HoughLines 和 HoughLinesP 来检测图像中的直线. 原理 Note 以下原理的说明来自书籍 学习OpenCV  ...

  2. 缺点 霍夫圆_基于机器视觉的磁环表面缺陷检测研究

    基于机器视觉的磁环表面缺陷检测研究 [摘要]:我国是磁性材料制造生产大国,磁材生产企业众多.目前,大多数磁材生产企业仍采用传统的人工对磁材进行尺寸测量与缺陷检测.随着我国产业制造的不断转型升级,企业对 ...

  3. python手势识别隐马尔可夫模型_使用隐马尔可夫模型的运动笔迹手势识别.doc

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp高等教育&nbsp>&nbsp科普读物 使用隐马尔可夫模型的运动笔迹手势识别.doc10页 ...

  4. 缺点 霍夫圆_霍夫圆变换

    对于直线来说,一条直线能有参数极径级角表示,而对圆来说我们需要三个参数来表示一个圆 在OpenCV中,我们常常通过一个叫"霍夫梯度法"的方法来解决圆变换的问题. 霍夫梯度法的原理 ...

  5. 缺点 霍夫圆_霍夫变换

    霍夫变换是一种特征提取,被广泛应用在图像分析.电脑视觉以及数位影像处理. 霍夫变换是用来辨别找出物件中的特征,例如:线条.他的算法流程大致如下,给定一个物件.要辨别的形状的种类,算法会在参数空间中执行 ...

  6. 缺点 霍夫圆_霍夫变换(Hough Transform)

    定义:被广泛应用在图像分析.计算机视觉领域的一种特征检测算法 Hough变换是从图像处理中识别几何形状的基本方法之一.Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线 ...

  7. OpenCV基于Python霍夫圆检测—基于梯度的霍夫圆检测

    基于梯度的霍夫圆检测 1. 回顾与目标 2. 基于梯度的霍夫圆检测 2.1 问题分析 2.2 基于梯度的霍夫圆检测步骤 3. 基于梯度的霍夫圆检测函数HoughCircles 3.1 函数HoughC ...

  8. opencv 霍夫线变换

    霍夫线变换 霍夫线变换是一种用来寻找直线的方法. 是用霍夫线变换之前, 首先要对图像进行边缘检测的处理,也即霍夫线变换的直接输入只能是边缘二值图像. 它是如何实现的? 众所周知, 一条直线在图像二维空 ...

  9. OpenCV基于Python霍夫圆检测—标准霍夫圆检测

    标准霍夫圆检测 1. 简介 2. 标准霍夫圆检测 2.1 情形一 2.2 情形二 2.3 情形三 3. 程序演示 4. 结尾 参考资料 1. 简介 1972年,R. D. Duda和P. E. Har ...

最新文章

  1. Wpf消息循环之消息传递
  2. CyberArticle(网文快捕)上传文件提示‘许可不足’
  3. 小米AIoT开发者大会28日召开,雷军的AIoT和小米的这一年
  4. 用Scikit-learn和TensorFlow进行机器学习_1
  5. JavaScript新手学习笔记4——我记不住的几个坑:短路逻辑、按值传递、声明提前...
  6. 无法停止‘通用卷’设备的解决方法
  7. linux 监听日志_Linux系统取证概述
  8. Mysql 的时区问题:zeroDateTimeBehavior CONVERT_TO_NULL convertToNull
  9. 凸优化第八章几何问题 8.5 中心
  10. 基于MATLAB OCR的发票识别系统
  11. AvalonDock学习总结
  12. 兄弟打印机内存已满清零方法_兄弟打印机打印时显示内存已满怎么处理
  13. 基于ENVI进行遥感影像裁剪
  14. matlab中累乘,numpy中的裁剪、压缩和累乘
  15. js 基础词汇及方法整理
  16. easyui datagrid deleteRow(删除行)的BUG或者updateRow值更新了不展示问题
  17. UNreal 创建一个简单的玻璃材质+金属材质+创建材质实例
  18. 16系列显卡支持的计算机系统,GTX16系列显卡登场
  19. Excel中序号自动填充
  20. SQL中的DML、DDL以及DCL是什么?

热门文章

  1. 评:国务院明确7大新兴产业发展重点
  2. OpenGL3.3着色器
  3. 守卫信息安全,如何高效检测和定位恶意监视设备?
  4. D触发器(Verilog)
  5. javascript为你写诗《春风十不如你》
  6. 【NLP】一文概览NLP算法(Python)
  7. js 字符串比较大小
  8. 从熵的角度去看公司变迁
  9. Ubuntu文件修改权限
  10. Linux 操作基础——shell