Hough变换原始形式-直线检测

Posted tina_ttl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hough变换原始形式-直线检测相关的知识,希望对你有一定的参考价值。

Hough变换原始形式-直线检测

标签(空格分隔): 数字图像处理 图像特征提取

本文同版本也发布在了cmd markdown小站(https://www.zybuluo.com/lutingting/note/554459),布局更漂亮些!


注意,本文在总结过程中,参考了许多其他绘图,每种情况下使用的符号不太一致,所以,每个小节使用的符号都仅以各小节图像为主,不要混淆!

1.直角坐标系与极坐标系中的直线表示

1.1 直角坐标系与极坐标系 中的点的表示及它们之间相互关系

极坐标系(polar coordinates)是指在平面内由极点O、极轴L和极径r组成的坐标系,下图就展示了一个极坐标系,图中两个红点是要利用极坐标表示的两个点,黑色点是极坐标系的极点

那么,极坐标系和直角坐标系之间什么关系呢?

  • 1.在直角坐标系下,点P的坐标表示为 (x,y)

  • 2.在极坐标系下,点的坐标表示为 (ρ,theta)

  • 3.某一点由极坐标转换为直角坐标

    x=ρcosθ
    y=ρsinθ

    注:图中的r与上面的 ρ 是同样的描述

  • 4.某一点直角坐标转换为极坐标

    • θ 的具体取值还需要根据点P具体位于哪个象限进行调整,根据点的直角坐标可以判断其位于哪个象限,具体判断方法如下图如示
    • 根据点具体落到四个象限中的哪一个,在arctan结果 的基础上进行修正,arctan结果位于(-π/2,π/2)区间,具体方法如下:
      • 点位于第一象限,则该点的极角为arctan
      • 点位于第二象限,则该点的极角为arctan+π
      • 点位于第三象限,则该点的极角为arctan+π
      • 点位于第四象限,则该点的极角为arctan+2

1.2 直角坐标系与极坐标系中的直线

在极坐标系下,应该如何表示直线方程呢?如上图所示,有一直线L,点P是直线L上任意一点,其对应的直角坐标为(x,y),该点的极坐标为 (φ,r) ,该直线距 离原点距离为ρ:

  • 首先,利用直线距离原点的距离的计算公式,可得下式
    ρ=rcos(θφ)
  • 然后,对该式利用三角函数展开,可以得到
    ρ=rcos(θφ)=rcos(θ)cos(φ)+rsin(θ)sin(φ)
  • 又根据点P的直角坐标系(x,y)与极坐标 (φ,r) 之间 的关系 rcos(φ)=x rsin(φ)=y ,可以得到
    ρ=xcosθ+ysinθ

即直线的极坐标方程! 也就是说,每一组参数 ρ (坐标原点到直线的距离)和 θ (垂线 ρ 与x轴正方向的夹角 )将唯一确定了一条直线!并且,在极坐标系下,直线的方程就是一个点

2.利用Hough变换检测直线

2.1 线到点的Hough变换

2.1.1 通俗解释

下面的例子形象地展示了如何利用Hough变换进行直线检测的过程,这里应该注意,图像中的一条直线其实就仅仅对应于极坐标系下(参数空间)的一个点:

  • 给定一幅图像
  • 检测边缘
  • 对于任何一个边缘点,找到所有可能经过该点的直线,这些直线每一条都对应着参数空间中的一个点,而无穷多条之间对应于极坐标系下的点将形成一条极坐标系下的曲线


  • 重复上面过程,每个边缘点都对应于极坐标系下的一条曲线,那么,极坐标系下 (参数空间)所有这些曲线的交点一定是原图像中所有边缘点共同存在的直线!

2.2 Hough变换检测直线的实现

2.2.1 赵小川教程中的例子

  • 假设一副图像大小为 M×M ,根据该图像尺寸,设定hough变换的参数空间取值范围
    • 原点距离直线的距离: ρ[2N,2N]
    • 原点到直线的垂线与x轴正方向的夹角: θ[0,π]
  • 按照参数的取值范围,将参数分为 m×n 个网格,即将 θ[0,π] 分为m份,将 ρ[2N,2N] 分为n份,然后,设定一个 m×n 的累加单元,用来存储图像中某一条直线出现的次数

  • 接下来,对图像中原图像中每一个像素点(x,y),分别进行如下操作:

    • 在参数 θ 对应的每一取值,分别按照公式 ρ=xcosθ+ysinθ 计算相应的参数 ρ 的取值
    • 然后,在相应的参数累加单元中加1
  • 按照上面操作,得到了一个累加单元,统计每个累加单元的取值,大于某个事先设定好的阈值,就认为该组参数便是图像空间内的直线的参数

2.2.2 matlab自带hough变换相关函数

matlab自带了Hough变换的相关函数:

  • hough:实现霍夫变换,得到霍夫变换矩阵,用法如下
    • [H, theta, rho] = hough(BW)
      • 输入BW为二值边缘图像
      • 输出H为参数空间参数的累加矩阵;
      • 输出theta为数值向量,存储划分参数空间的参数 θ 的所有取值;
      • 输出rho为数值向量,存储划分参数空间的参数 ρ 的所有取值
    • [H, theta, rho] = hough(BW, ParameterName,ParameterValue)
      • 这里增加了一组用来指定参数 θ ρ 的区间范围(及间隔)
      • ‘RhoResolution’:指定参数 θ 的区间的间隔
      • ‘ThetaResolution’:指定参数 ρ 的区间的间隔
      • ‘Rho’:指定参数 ρ 的区间的范围(及间隔),例如:1:0.5:100(注:默认值为(0,norm(size(BW))),即最大值为图像对角线长度,间隔为1)
      • ‘Theta’:指定参数 θ 的区间的范围(及间隔),例如:0:0.5:50,(注:默认值为[-90°,90°),间隔为1,单位为度)
  • houghpeaks:在霍夫变换矩阵里找极值点