霍夫变换(Hough Transform)

一、直线检测相关算法  

1.1 霍夫变换(Hough Transform) 

  霍夫变换(Hough Transform)换于1962年由Paul Hough 首次提出,后于1972年由Richard Duda和Peter Hart推广使用,是图像处理中从图像中检测几何形状的基本方法之一。经典霍夫变换用来检测图像中的直线,后来霍夫变换经过扩展可以进行任意形状物体的识别,例如圆和椭圆。
  
  霍夫变换运用两个坐标空间之间的变换将在一个空间中具有相同形状的曲线或直线映射到另一个坐标空间的一个点上形成峰值,从而把检测任意形状的问题转化为统计峰值问题。
  
  参考论文:
  [1] P.V.C. Hough,Machine Analysis of Bubble Chamber Pictures, Proc. Int. Conf. High Energy Accelerators and Instrumentation, 1959.
  [2] Duda, R. O. and P. E. Hart, “Use of the Hough Transformation to Detect Lines and Curves in Pictures,”Comm. ACM, Vol. 15, pp. 11–15 (January, 1972).
  
  

1.2 霍夫直线检测(Hough Line Detection) 

  Hough直线检测的基本原理在于利用点与线的对偶性,在我们的直线检测任务中,即图像空间中的直线与参数空间中的点是一一对应的,参数空间中的直线与图像空间中的点也是一一对应的。这意味着我们可以得出两个非常有用的结论:
  1)图像空间中的每条直线在参数空间中都对应着单独一个点来表示;
  2)图像空间中的直线上任何一部分线段在参数空间对应的是同一个点。
  
  因此Hough直线检测算法就是把在图像空间中的直线检测问题转换到参数空间中对点的检测问题,通过在参数空间里寻找峰值来完成直线检测任务。
  


  

二、霍夫直线检测的基本原理

2.1 关于对偶性

  首先,我们通过实例来解释一下对偶性的意义。
  1)图像空间中的点与参数空间中的直线一一对应
  在图像空间x-y中一条直线在直角坐标系下可以表示为:
  


  其中k和b是参数,对应表示斜率和截距。
  


  过某一点A(x0, y0)的所有直线的参数均满足方程y0=k*x0+b,即点A(x0, y0)确定了一族直线。
  如果我们将方程改写为:
  


  那么该方程在参数空间k-b中就对应了一条直线:
  


  也就是说,图像空间x-y中的点(x0,y0)对应了参数空间k-b中的直线b=-k*x0+y0。因此可以得到结论,图像空间中的点与参数空间中的直线一一对应。
  
  2)图像空间中的直线与参数空间中的点一一对应
  我们在直线y=k*x+b上再增加一个点B(x1, y1),如下图所示:
  


  那么点B(x1, y1)在参数空间同样对应了一条直线:
  

  
  可以看到,图像空间x-y中的点A和点B在参数空间k-b中对应的直线相交于一点,这也就是说AB所确定的直线,在参数空间中对应着唯一一个点,这个点的坐标值(k0, b0)也就是直线AB的参数。
  
  以上就是在直线检测任务中关于对偶性的直观解释。这个性质也为我们解决直线检测任务提供了方法,也就是把图像空间中的直线对应到参数空间中的点,最后通过统计特性来解决问题。假如图像空间中有两条直线,那么最终在参数空间中就会对应到两个峰值点,依此类推。
  

2.2 参数空间的选择

  上述为了方便讲解对偶性和霍夫变换的基本原理,我们的参数空间也选择了笛卡尔直角坐标系。但在实际应用中,参数空间是不能选择直角坐标系的,因为原始图像直角坐标空间中的特殊直线x=c(垂直x轴,直线的斜率为无穷大)是没办法在基于直角坐标系的参数空间中表示的。
  
  所以在实际应用中,参数空间采用极坐标系ρ-θ,图示如下:
  


  直线的表达式为:
  

  化简便可得到:
  


  对于直线上的点(x0, y0),可以将通过该点的直线族定义为:
  


  
  
  这就回到我们刚才的结论,参数空间的每个点(ρ,θ)都对应了图像空间的一条直线,或者说图像空间的一个点在参数空间中就对应为一条曲线。参数空间采用极坐标系,这样就可以在参数空间表示原始空间中的所有直线了。
  注意,此时图像空间(直角坐标系x-y)上的一个点对应到参数空间(极坐标系ρ-θ)上是一条曲线,确切的说是一条正弦曲线。
  


  

2.3 利用霍夫变换检测直线

  如前所述,霍夫直线检测就是把图像空间中的直线变换到参数空间中的点,通过统计特性来解决检测问题。具体来说,如果一幅图像中的像素构成一条直线,那么这些像素坐标值(x, y)在参数空间对应的曲线一定相交于一个点,所以我们只需要将图像中的所有像素点(坐标值)变换成参数空间的曲线,并在参数空间检测曲线交点就可以确定直线了。
  
  在理论上,一个点对应无数条直线或者说任意方向的直线,但在实际应用中,我们必须限定直线的数量(即有限数量的方向)才能够进行计算。
  
  因此,我们将直线的方向θ离散化为有限个等间距的离散值,参数ρ也就对应离散化为有限个值,于是参数空间不再是连续的,而是被离散量化为一个个等大小网格单元。将图像空间(直角坐标系)中每个像素点坐标值变换到参数空间(极坐标系)后,所得值会落在某个网格内,使该网格单元的累加计数器加1。当图像空间中所有的像素都经过霍夫变换后,对网格单元进行检查,累加计数值最大的网格,其坐标值(ρ0, θ0)就对应图像空间中所求的直线。
  


  
  以上就是霍夫直线检测算法要做的,它检测图像中每个像素点在参数空间对应曲线之间的交点,如果交于一点的曲线的数量超过了阈值,那就可以认为这个交点(ρ,θ)在图像空间中对应一条直线。
    
    

2.4 霍夫直线检测的优缺点

  优点:
  Hough直线检测的优点是抗干扰能力强,对图像中直线的殘缺部分、噪声以及其它共存的非直线结构不敏感。
  缺点:
  Hough变换算法的特点导致其时间复杂度和空间复杂度都很高,并且在检测过程中只能确定直线方向,丢失了线段的长度信息。
  
  

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JDK 9是某些功能的终结

几天前宣布JDK 9是Feature Complete! 进行剪切的许多“功能”都是添加项,但有些是删除项。 这篇文章介绍了从OpenJDK和/或Oracle的JDK Java 9中删除的一些项目。 JEP 220 (“模块化运行时图像”)的一部分是删除了Java认可标准覆盖…

一种table超出高度自动出滚动条的解决方案

参考链接: http://www.cnblogs.com/xiaoafei1991/archive/2015/09/30/4781592.html转载于:https://www.cnblogs.com/ziyoublog/p/10870048.html

最近邻插值、双线性插值、双三次插值

1.最近邻插值 越是简单的模型越适合用来举例子,我们就举个简单的图像:3X3 的256级灰度图,也就是高为3个象素,宽也是3个象素的图像,每个象素的取值可以是 0-255,代表该像素的亮度,25…

java map转json字符串_Java-Gso-json字符串解析-php后台返回字段类型可能为字符串(/空字符串)或者对象的情况...

其实本来android前端定义的对象类型是对象,如果后台没有值的情况下,理论上给null,如果是数组给[]或者null都可以的。这样Gson再解析转换的时候就不会出问题!但是最近重构发现后台如果没有字段值给的是""空字符串&#x…

oracle中时间加减一年的写法

select add_months(date2019-5-15,-12) from dual; -- 2018-5-15 通过add_months(x,y)函数,在给定的时间x固定的月份y select date2019-5-15 interval -1 year from dual; --2018-5-15 通过interval函数,这个用来表示一段时间间隔,有固定的格式,这里用来加一年&a…

'fopen' This function or variable may be unsafe

1>...error C4996: fopen: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> 正在生成代码... 生成: 成功 0 个,失败 1 个,最…

python3捕获异常_python中异常捕获方法详解

在Python中处理异常使用的是try-except代码块,try-except代码块放入让python执行的操作,同时告诉python程序如果发生了异常该怎么办,try-except这个功能其实很多入门书籍中都放到了高级篇幅里,在入门的时候一般不会讲这个使用&…

自定义java线程池_我的Java自定义线程池执行器

自定义java线程池ThreadPoolExecutor是Java并发api添加的一项功能,可以有效地维护和重用线程,因此我们的程序不必担心创建和销毁线程,也不必关注核心功能。 我创建了一个自定义线程池执行程序,以更好地了解线程池执行程序的工作方…

es6方法过滤掉两个数组中对象id值相等的项

let arr1[{id:1,name:张三},{id:2,name:李四}] let arr2[{id:1,name:张三},{id:3,name:王五},{id:44,name:王柳},{id:45,name:王琦},] let addarr2.filter(item>!arr1.some(ele>ele.iditem.id)) console.log(add) const arr1 [{ id: 1, name: 网 }, { id: 2, name: 二位…

大尾和小尾

字节存放有大尾和小尾之分。如果对应数据的高字节存放在低地址就是大尾,反之,高字节存放在高地址的就是小尾。 比如 short int a 0x1234 大尾存放时: 偏移地址 存放内容 0x0000 0x12 0x0001 0x34 小尾存放: 偏移…

jedis使用_Redis的三个框架:Jedis,Redisson,Lettuce

Jedis api 在线网址:http://tool.oschina.net/uploads/apidocs/redis/clients/jedis/Jedis.htmlredisson 官网地址:https://redisson.org/redisson git项目地址:https://github.com/redisson/redissonlettuce 官网地址:https://le…

端到端BPM(带有DMN标记)

下周的红帽峰会即将成为有史以来最好的峰会之一! 而且,如果您是Drools或jBPM的狂热者,您会很忙 :Signavio和Red Hat之间的合作伙伴关系是我们为您准备的另一个顶级演讲。 邓肯道尔(Duncan Doyle)和汤姆德贝…

pycharm写python字典_pythonpycharm安装基础语法

1.python安装安装python3,建议安装python3.7,不要安装python2安装时需要注意的地方:安装完成后,验证python是否安装成功,在cmd下输入python,出现python的版本则表明安装成功验证pip是否安装成功&#xff0c…

模板库 | 销售管理类报表,邀您提反馈

“葡萄城报表模板库是一款免费的报表制作、学习和参考工具,包含了超过 200 张高质量报表模板,涵盖了 16 大行业和 50 多种报表类型,为 30 余万报表开发者提供价值参考。” 近期,葡萄城推出了“寻找真正的报表大师”活动&#xff0…

矩阵的逆、伪逆

1、矩阵的逆 定义: 设A是数域上的一个n阶方阵,若在相同数域上存在另一个n阶矩阵B,使得: ABBAI。 则我们称B是A的逆矩阵,而A则被称为可逆矩阵。 可逆条件: A是可逆矩阵的充分必要条件是,即可…

PLSQL登录报错ORA-12154

https://blog.csdn.net/naomi_qing/article/details/79583453 转载于:https://www.cnblogs.com/2016-cxp/p/10878952.html

python将dataframe导出为csv_python将dataframe转换为csv,为每列导出一个格式独特的文本文件...

我正在Win7 64位上使用Python2.7.7和熊猫。我的输入数据最初是以空格分隔的,右对齐的。我现在有数据作为熊猫数据帧,我导出为一个csv。我想写一个空格分隔的右对齐文本文件。列有字符串、int和float。我试图用这个来格式化其中一个列:df_fg[M…

jax-rs/jersey_在Oracle Cloud上的Prime-UI,JAX-RS和Jersey和Gson

jax-rs/jersey如今,Oracle云无处不在。 最初,拉里(Larry)否认在很长一段时间内都需要云,并且在去年的开放世界(Open World)之后就发布了一些非常早的公告,而且可用性很差&#xff0c…

OpenCV copyMakeBorder()来拓展边界

使用OpenCV提供的函数copyMakeBorder()来拓展边界,其原型如下 void copyMakeBorder( InputArray src, OutputArray dst,int top, int bottom, int left, int right, int borderType,const Scalar& value Scalar())​ src:输入的数组。 dst&…

Flutter-现有iOS工程引入Flutter

前言 Flutter 是一个很有潜力的框架,但是目前使用Flutter的APP并不算很多,相关资料并不丰富,介绍现有工程引入Flutter的相关文章也比较少。项目从零开始,引入Flutter操作比较简单,但是现有工程引入Flutter 需要费很多精…