hough变换检测圆原理(定位变换后的面如何变成实体)

Hough变换基本原理Hough变换是由PaulHough于1962年提出的一种检测圆的算法,它的基本思想是将图像从原图像空间变换到参数空间,在参数空间中,使用大多数边界点都满足的某种参数形式作为图像中的曲线的描述,它通过设置累加器对参数进行累积,其峰值对应的点就是所需要的信息。Hough变换最大的优点是对噪声不敏感。对于满足直线方程y=ax+b的某一个点(x0,y0),对应于参数平…

大家好,又见面了,我是你们的朋友全栈君。

Hough变换基本原理

Hough变换是由Paul Hough于1962年提出的一种检测圆的算法,它的基本思想是将图像从原图像空间变换到参数空间,在参数空间中,使用大多数边界点都满足的某种参数形式作为图像中的曲线的描述,它通过设置累加器对参数进行累积,其峰值对应的点就是所需要的信息。

Hough变换最大的优点是对噪声不敏感。

对于满足直线方程y=ax+b的某一个点(x0,y0),对应于参数平面(a,b)上的一条直线b= y0-ax0,而来自于这条直线上的其他数据点也必然对应于参数平面(a,b)上的直线,且相交于特定的参数点(a,b)。

在实际应用中,为了避免垂直直线斜率无穷大的问题,通常采用直线极坐标的方程r=xcosq+ysinq,显然此时参数面变为(rq)面。

直线由两点A(x1,y1)和B(x2,y2)定义(如下图a所示)。

通过点A的所有直线可由方程y1=k x1+q表示,其中kq是表示斜率和截距的一定值,如果我们将kq认为是参数空间的话,此时通过点A的所有直线就可以表示为q= – x1 k + y1 (如图b所示)。

hough变换检测圆原理(定位变换后的面如何变成实体)

同理,通过点B的所有直线可由方程y2=k x2+q表示,在参数空间kq中,通过点B的所有直线就可以表示为q= – x2 k + y2,此时,图b中两条直线的唯一公共交点表示的就是图a中连接A、B两点的直线。

这样,原图像空间中直线上的每一点都可以映射为参数空间kq中的一条直线,我们对参数空间的点进行累计,其峰值就对应图像空间中要确定的直线。

因此,对于Hough变换,有以下对应关系:

  • 图像空间的一条直线在参数空间映射为一个点。
  • 图像空间的一个点映射为参数空间的一条正弦曲线。
  • 图像空间的一条直线上的多个共线点映射为参数空间相交于一点的多条正弦曲线。

Hough变换的具体算法步骤如下:

  • 适当的量化参数空间。
  • 将参数空间的每一个单元看作一个累加器。
  • 初始化累加器为0。
  • 对图像空间的每一点,在其所满足参数方程对应的累加器上加1。
  • 累加器存储的最大值即为对应的图形的参数。

Hough圆检测原理及方法

Hough变换不仅适用于直线检测,还适用于任何形式的f(x,a)=0所表示的图形的检测,其中x 表示坐标向量,a表示系数向量。下边我们对Hough变换检测圆的原理做简要介绍。

对于一个半径为r,圆心为(a,b)的圆,我们将其表示为:

hough变换检测圆原理(定位变换后的面如何变成实体)

此时x=[x,y]T,a=[a,b,r]T,其参数空间为三维。

显然,图像空间上的一点(x,y),在参数空间中对应着一个圆锥,如下图所示。

hough变换检测圆原理(定位变换后的面如何变成实体)

而图像空间的一个圆就对应着这一簇圆锥相交的一个点,这个特定点在参数空间的三维参数一定,就表示一定半径一定圆心坐标的图像空间的那个圆。

上述方法是经典的Hough圆检测方法的原理,它具有精度高,抗干扰能力强等优点,但由于该方法的参数空间为三维,要在三维空间上进行证据累计的话,需要的时间和空间都是庞大的,在实际应用中不适用。

为加快Hough变换检测圆的速度,学者们进行了大量研究,也出现了很多改进的Hough变换检测圆的方法。

如利用图像梯度信息的Hough变换,对圆的标准方程对x求导得到下式:

hough变换检测圆原理(定位变换后的面如何变成实体)

从上式看出,此时的参数空间从半径r,圆心(a,b)三维,变成了只有圆心(a,b)的二维空间,利用这种方法检测圆其计算量明显减少了。

但这种改进的Hough变换检测圆的方法其检测精度并不高,原因在于,此种方法利用了边界斜率。

从本质上讲,边界斜率其实是用曲线在某一点的弦的斜率来代替的,这种情况下,要保证不存在误差,只有在弦长为零的情况。

但在数字图像中,曲线的表现形式是离散的,其在某一点处的斜率指的是此点右向n步斜率或是左向n步斜率。

如果弦长过小了,斜率的量化误差就会增大。

这种方法比较适用于干扰较少的完整圆形目标。

除了上述方法外,还有其他的一些Hough圆检测算法。

如随机Hough变换,它的主要思想是通过在图像空间中随机抽样来降低内存需求与计算时间,具体做法是在图像空间中随机选取不共线的三点映射到参数空间,参数空间的单元集是一个动态链表结构,当参数单元陈列的值到达一定阈值就认为其确定了一个圆,将其作为候选圆,再通告证据累计统计图像空间中落在该候选圆上的点数,若点数大于一定阈值,确认为真实圆。

此种方法有效的降低了计算量和时间消耗,但其也存在一定问题,如无效累积量大,检测效率不高等其检测精度也低于经典的Hough变换。

另外还有王建峰等改进的快速随机Hough变换,其基本思想是,考虑到圆必定在其外接正方形之内,为了减少随机Hough变换的无效累计,可以只对外接正方形之内的像素进行计算,之外的像素可以直接排除,这样大大降低了计算时间。

可以取边缘厚度为一个较小数t,对于任意三点确定对应的参数圆心(a,b)和半径r,边缘点集中的点di(dix,diy),如果有dix >a+r+t或dix <a-r-t或diy >b+r+t或diy <b-r-t,则不必对其进行计算。

通过这种方法就可以排除大量不是候选圆的点,提高了速度。

这种方法的缺点是没有解决好候选圆外接或者内切正方形的边长问题。

通常情况下,影响常规Hough变换的运算速度的因素主要有:参数空间的维数,边缘点的数量,运算的复杂性,参数空间的离散化程度,以及最后的峰值检测等。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/127628.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • php 递归算法

    php 递归算法通过递归实现阶乘functionmulti($n){

  • Java中StringBuilder类「建议收藏」

    Java中StringBuilder类「建议收藏」提要大家要知道字符串(String)在进行拼接操作时,每一次拼接,都会构建一个新的String对象这样耗时又浪费内存解决方法就是StringBuilder类,就可以解决这个问题StringBuilder类中方法和String类基本一样我举例几个使用最多的方法创建//创建StringBuilderStringBuildersb=newStringBuilder(“老八”);System.out.println(sb);//输出如果括号里不填默认是空字符串

  • phpstorm2021.3.2 激活破解方法[通俗易懂]

    phpstorm2021.3.2 激活破解方法,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • 1、Java从入门到精通

    1、Java从入门到精通将自己学习的Java基础整理出来,方便复习和记忆~~一、Java的历史1、Java开发分成了3个方向JavaSE:主要用于桌面程序的开发,学习JavaEE和JavaME的基础JavaEE:主要用于网页程序的开发JavaME:主要用于嵌入式系统程序的开发2、JavaSE平台中的lib软件包Java.lang包——语言核心包java.util包——Jav…

  • python3菜鸟教程笔记

    python3菜鸟教程笔记python2和python3的一些差异:*print函数变了,python3中的print函数必须要加括号*xrange函数合并到了range中,2到5的序列可以直接用range(2,5

  • python运算符

    什么是操作符?简单的回答可以使用表达式4+5等于9,在这里4和5被称为操作数,+被称为操符。 Python语言支持操作者有以下几种类型。算术运算符比较(即关系)运算符赋值运算符

    2021年12月23日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号