在图像处理和计算机视觉领域中,如何从当前的图像中提取所需要的特征信息是图像识别的关键所在。在许多应用场合中需要快速准确地检测出直线或者圆。其中一种非常有效的解决问题的方法是霍夫(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. Oracle 10.2.0.5.4 Patch Set Update (PSU) – Patch No: p12419392
  2. Eclipse + Spring boot +mybatis + mysql
  3. 智慧树python程序设计基础山东联盟期末答案_智慧树Python程序设计基础(山东联盟)期末答案...
  4. 解构电商产品——订单系统(一)
  5. 【转】如何在 Visual Studio 2019 中连接中国版 Azure
  6. java 字符串实例_Java字符串实例
  7. python打印一个对象的所有属性_python打印出所有的对象/模块的属性代码详解
  8. 图标圆角角度_教你在 iOS 和 macOS 上获取 App 图标
  9. jdk16新特性_jdk8到jdk16新特性
  10. 解决报错: ‘v-slot‘ directive must be owned by a custom element, but ‘div‘ is not
  11. oracle 更改归档位置,oracle更改归档路径
  12. Civil 3d 之枚举 SpiralType
  13. 想要学好云计算,这四个方法要掌握!
  14. 上海市计算机学会-买二送一
  15. kafka监控获取logSize, offset, lag等信息
  16. 【封装】Deviation求方差
  17. 微软云计算产品详解 主打Windows
  18. 【python】取txt文件中的单词存到SQLite数据库,并且从bing词典爬取单词详情
  19. 无线技术给网络插上飞翔的翅膀(转)
  20. PMI-ACP考试没过怎么办?如何补考?

热门文章

  1. Golang学习笔记(十七):len函数
  2. 学python多大年龄可以学车_考驾照最大多少多大年龄可以报名
  3. 我的Mac软件清单(1)~(含图解)
  4. java的amazons3增删改,Java AmazonS3.deleteObject方法代码示例
  5. 电脑速度慢的136种慢法和解决方法!! 经典实用!!
  6. javascript感叹号1_javascript中的感叹号 !
  7. PHP全部版本下载地址
  8. 直播行业的未来增量:一边内容升级,一边驱动演艺
  9. GitHub教程 如何修改Github用户名
  10. WinFrom中实现点击关闭按钮窗口在靠屏幕左边中间缓缓收缩