zoukankan      html  css  js  c++  java
  • 霍夫变换

    一 霍夫直线变换

    1 点斜式

    直线方程可表示为:y = kx + b, 当k, b确定时,在xy平面上确定一条唯一直线;考虑同样的变形 b = -xk + y,当x, y确定时,可以看做在kb平面上确定的一条唯一直线;若x, y表示xy平面上一个已知坐标点,则经过该坐标点(x, y)可形成多条直线, 其表达式为:b = -xk + y。

    考虑在平面图像上存在一条有效直线段,遍历图像上每一个点,并计算出每个点可能形成的直线参数;发现某个特定参数(k, b)出现次数最多,这个特定参数应该为图像上有效直线段的参数(k, b)。

    通过以上观察,可以将参数(k, b)离散化,然后遍历平面图像上的每一个点,累加可能形成直线(k, b)参数;当遍历完整个图像后,在累加器(k, b)中会产生一个全局最大值,该值为平面图像上有效直线的参数(k, b)。

    当平面图像上存在多条有效直线段时,在累加器(k, b)中会产生多个局部极大值,可以通过设定合理的阈值以检测出平面图像上的多条直线段。

    2 极坐标

    使用点斜式检测直线存在两个问题:

     1)y = kx + b 无法表达平行于y轴的直线段(k为无穷大);

     2)k, b取值都趋近于无穷大,离散化(k, b)后参数空间趋近无穷大,计算机存储空间有限;

     通过坐标转换,将直角坐标转换为极坐标可以解决以上问题。

     根据图形可得:ab = 0 (向量a与向量b正交)

    =>, 其中(x, y)为直线L上的任意点;

    =>, 其中(x, y)为直线L上的任意点;

    考虑在平面图像上存在一条有效直线段,离散化参数,然后遍历平面图像上每一个点,累加可能形成的直线参数;类似的,在平面上会产生一个全局最大值,该值即为平面图像上的有效直线参数;同理,针对平面图像上存在多条有效直线段情况,可以通过局部极大值检测多条有效直线段。

    二 霍夫圆变换

     圆的方程式可表达为:,参数确定一个圆;

     离散化参数,遍历平面图像上每一个点,累加可能形成的圆参数, 在参数空间中寻找全局最大值或局部极大值以检测有效圆;

     圆的方程也可表达为:,参数确定一个圆;

     固定,遍历平面图像上每一个点,根据公式累加  参数空间,在参数空间寻找全局最大值或局部极大值以检测半径为的有效圆;

     多次遍历平面图像,并选择不同的半径可以检测平面图像上任意半径的圆。

     三 霍夫变换检测椭圆

    平面上任意一个椭圆均可以看做单位圆经过缩放,旋转,平移操作形成,设在单位圆上的坐标点,经过缩放,旋转,平移变换的表达式为:

    ,其中单位圆表达式为:

    =>

    表达式构成参数空间,离散化该参数空间, 遍历平面图像上每一个点,累加可能形成椭圆的参数,在参数空间中寻找全局最大值或局部极大值检测椭圆。

    四 广义霍夫变换

      对于非解析图形,可以使用广义霍夫变换(Generalized Hough Transform)寻找目标中心位置,具体思路如下:

      1)对已知形状,首先选择参考点(一般为图形重心点);

      2)计算图形边缘点上的梯度方向,将边缘方向离散化为:

      3)将边缘点与参考点之间的关系表示为: ,或等效表示为: ,如下图:

          

        4)将边缘点所在边缘方向离散化,并根据离散化后边缘方向索引填充R-table,如下图:

         

         5)如果被检测图形没有旋转与缩放,可以直接使用上表在  空间上寻找最值点。但一般情况下,被检测图形总会存在旋转与缩放,故需要对R-table进行更多处理,具体如下:

              考虑对  所表示的线段做任意旋转与缩放有:,其中  为旋转角度,s 为缩放比例;

              边缘点(上)旋转缩放后的中心点为: 

              另外,当图形旋转  后,原边缘点(上)的边缘方向也旋转  ,故需要在  行上增加相应的  值;遍历所有旋转及缩放,填充R-table表以实现旋转缩放收缩。

        6)在新图像中搜索边缘点,并根据边缘方向查找R-table表,对表中每一个  项应用公式:,得到  位置;

        7)在  中寻找极大值作为检测到图形中心。

  • 相关阅读:
    java.lang.NoClassDefFoundError: org/jaxen/JaxenException解决方法
    SVN被锁定的几种解决方法
    URL传参时中文参数乱码的解决方法
    Log4j.properties配置详解
    如何在Oracle中向Collection类型的变量中逐条插入数据
    oracle中比较两表表结构差异和数据差异的方法
    报错,但不影响运行ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
    JavaScript访问修改CSS样式表
    有关缓存
    emacs使用记录
  • 原文地址:https://www.cnblogs.com/luofeiju/p/9262336.html
Copyright © 2011-2022 走看看