【数字图像处理】霍夫(Hough)变换

系列文章目录

本系列主要是在阅读论文时的学习笔记,在遇到较为经典的数字图像处理的算法和知识点,对其进行整理和总结,主要包括原理,方法,算法等。(希望可以坚持下来)

系列文章目录如下:

暂时还没(持续更新)



绪论

霍夫变换是一种较为经典的检测简单形状如线段和圆形、椭圆等的方法。采用的基本思想是累加投票的思想。


一、霍夫变换原理

        在笛卡尔坐标系(平面直角坐标系)中表示一条直线的方法有两种:

  1. y = kx + b
  2. r = xcosθ + ysinθ

 1.1 y = kx + b

        在此,常用的方法是第一种,已知确定的k0、b0就可以确定一条直线。由此引入霍夫空间。在笛卡尔坐标系空间下,横坐标为x,纵坐标为y,而在霍夫空间的坐标系下,横坐标为k,纵坐标为b,要表示霍夫坐标系下的直线采用的方法是:b = xk + y 。

        那对于一条已知的确定的直线:y = k0x +b0,在霍夫坐标系下有已知一点(k0, b0)与其对应。而相对应的若在霍夫坐标系下有直线:b = -x0k + y0,在直角坐标系下有已知一点(x0, y0)与其对应。在此要注意负号是因为在进行对应是y = kx + b对应的是b = -xk + y 。相关的对应关系如下图所示:

标题笛卡尔坐标系中一已知直线对应霍夫坐标系中的一点
标题霍夫空间中的一已知直线对应笛卡尔坐标系中一点

        所以得出映射关系:

  • 笛卡尔坐标系中一已知直线映射霍夫坐标系中的一点
  • 霍夫空间中的一已知直线映射笛卡尔坐标系中一点

1.2 r = xcosθ + ysinθ

        而在笛卡尔坐标系中有一特殊存在:x = a(垂直于x轴的直线,k无穷大),在这种情况就无法在一般的霍夫坐标系中找到一点与其对应,这时要将坐标转换成极坐标的形式(ρ-θ),ρ是原点到直线的垂直距离,θ是直线的垂线与横轴逆时针方向的夹角,垂直线的角度为0,水平线的角度为180度。在霍夫空间中坐标系的横坐标变为θ,纵坐标变为ρ。

        映射关系如下图所示:

极坐标下的相互映射关系

        所以映射关系变为:

  • 笛卡尔极坐标系内的一已知点映射到霍夫空间中是一曲线
  • 霍夫空间极坐标系内的一已知点映射到笛卡尔空间中是一直线

1.3 使用原理

        目的: 找笛卡尔空间中的线条

  1. 笛卡尔空间转换到霍夫空间,将笛卡尔空间中的点,转换成霍夫空间中的直线(曲线)
  2. 很多的点被转换成直线(曲线),这些线会产生交点。
  3. 在霍夫空间找交点最多的点,这个点的霍夫坐标值就是笛卡尔空间中的线条的k和b(ρ和θ)。


二、实现步骤

假设有一个100x100像素的图片,现在使用霍夫变换检测图片中的直线:
1、创建一个二维数组,初始化所有值为0。数组的行表示r,列表示θ。即创建了一个在霍夫空间中的极坐标系。数组尺寸的大小决定着结果的准确性。如果我们希望直线的角度的精度为1度,那这个数组的列就设置为180列,每列是一度,依次从0度到180度。数组的行表示r,如果我们希望直线的精度达到像素级别的,r的最大值就应该等于图像的对角线距离(即认为图像的左上角为图像原点,图像中点到原点的距离即为r),所以r就从0取到图像的对角线长度值。这个数组我们又称为累加器。
2、遍历原图中的每一个点,计算每个点在θ取0-180之间的每个r,如果这个数值在上述累加器中存在相应的位置,则在该位置上加1。遍历后即获得了在霍夫空间中极坐标系中的很多曲线。
3、搜索累加器中的最大值,(即找到2中获取的霍夫空间中极坐标系中的很多曲线的交点)并找到这个最大值对应的r和θ,就可以将图像中直线表示出来了。


引用

相关参考及引用:


  1. opencv学习笔记(十六):霍夫变换
  2. 第16章:霍夫变换

猜你喜欢

转载自blog.csdn.net/shisniend/article/details/125809795