【OpenCv】霍夫直线检测

文章目录

前言

Hough变换是实现边缘检测的一种有效方法,其基本思想是将测量空间的一点变换到参量空间的一条曲线或曲面,而具有同一参量特征的点变换后在参量空间中相交,通过判断交点处的积累程度来完成特 征曲线的检测。

1 原理

保罗·哈夫于1962年提出了Hough变换法,并申请了专利。该方法 将图像空间中的检测问题转换到参数空间,通过在参数空间里进行简单的累加统计完成检测任务,并用大多数边界点满足的某种参数形式来描述图像的区域边界曲线。这种方法对于被噪声干扰或间断区域边界的图像具有良好的容错性。Hough变换最初主要应用于检测图像空间中的直线,最早的直线变换是在两个笛卡儿坐标系之间进行的,这给检测斜率无穷大的直线带来了困难。1972年,杜达(Duda)将变换形式进行了转化,将数据空间中的点变换为ρ − θ ρ-θρ−θ参数空间中的曲线,改善了其检测直线的性能。该方法被不断地研究和发展,在图像分析、计算机视觉、模式识别等领域得到了非常广泛的应用,已经成为模式识别的一种重要工具。
直线的方程可由下面式子表示:
y = k x + b \begin{aligned} &y = kx + b \end{aligned}​y =k x +b ​
其中,k k k和b b b分别是斜率和截距。现在将y = k x + b y=kx+b y =k x +b转换成b = − x k + y b=-xk+y b =−x k +y,因为k k k和b b b都是确定值所以在x − y x-y x −y平面上的一条线在k − b k-b k −b平面上代表一个点。

【OpenCv】霍夫直线检测
【OpenCv】霍夫直线检测
其次是过x − y x-y x −y平面上的某一点(x 0 x_0 x 0 ​,y 0 y_0 y 0 ​) 的所有直线的参数都满足方程y 0 = k x 0 + b y_0=kx_0+b y 0 ​=k x 0 ​+b。即过x − y x-y x −y平面上点(x 0 x_0 x 0 ​,y 0 y_0 y 0 ​)的一族直线在参数k − b k-b k −b平面上对应于一条直线。同样的道理将该族直线y 0 = k x 0 + b y_0=kx_0+b y 0 ​=k x 0 ​+b转变到k − b k-b k −b平面上有b = − x 0 k + y 0 b=-x_0k+y_0 b =−x 0 ​k +y 0 ​,此时斜率(− x 0 -x_0 −x 0 ​)和斜距(y 0 y_0 y 0 ​)固定,b b b为k k k的函数,所以在k − b k-b k −b平面上对应于一条直线。
【OpenCv】霍夫直线检测
【OpenCv】霍夫直线检测
可以看出如果笛卡尔坐标系的点共线,这些点在霍夫空间对应的直线交于一点:这也是必然,共线只有一种取值可能。再来考虑特殊情况,当三点共线恰好垂直x x x轴呢?此时直线的斜率k k k为无穷大,y = k x + b y=kx+b y =k x +b形式的直线方程无法表示x = c x=c x =c(c c c为常数)形式的直线。所以在实际应用中,一般采用距离和角度参数方程来表示如下:
ρ = x c o s θ + y s i n θ \begin{aligned} &ρ=xcosθ+ysinθ \end{aligned}​ρ=x cos θ+ys in θ​
其中,ρ ρρ为原点到直线的垂直距离,θ θθ为ρ ρρ与x x x轴的夹角,转换过程如下,注意的是这个并不是极坐标表达式,只是形式写起来跟极坐标的形式是一样的。这是因为ρ ρρ和θ θθ都是固定的,对应唯一的直线,而如果是极坐标,那其他对的ρ ρρ和θ θθ也会满足这一直线。
【OpenCv】霍夫直线检测
【OpenCv】霍夫直线检测

; 2 算法流程

①将参数空间量化成m × n m×n m ×n(m m m为θ θθ的等份数,n n n为ρ ρρ的等份数)个单元,并设置累加器矩阵Q [ m × n ] Q[m×n]Q [m ×n ];
②给参数空间中的每个单元分配一个累加器Q Q Q(θ i θ_i θi ​,p j p_j p j ​)(0 < i < m − 1 0, 0 < j < n − 1 0),并把累加器的初始值置为零;
③将直角坐标系中的各点(x k x_k x k ​,y k y_k y k ​)(k = 1 k=1 k =1,2 2 2,…,s s s,s s s为直角坐 标系中的点数)代入式ρ = x c o s θ + y s i n θ ρ=xcosθ+ysinθρ=x cos θ+ys in θ,然后将θ 0 ~ θ m − 1 θ_0~θ_{m-1}θ0 ​~θm −1 ​也都代入其中,分别计算出相应的值p j p_j p j ​;
④在参数空间中,找到每一个(θ i θ_i θi ​,p j p_j p j ​)所对应的单元,并将该 单元的累加器加1,即Q Q Q(θ i θ_i θi ​,p j p_j p j ​) = == Q Q Q(θ i θ_i θi ​,p j p_j p j ​) + 1 +1 +1,对该单元进行一次投票;
⑤待x − y x-y x −y坐标系中的所有点都进行运算之后,检查参数空间的累加 器,必有一个出现最大值,这个累加器对应单元的参数值作为所求直线的参数输出。当然你可以指定一个阈值,就是投票数达到多少就可以认定为一条直线,这样就可以一次性输出多条直线。

【OpenCv】霍夫直线检测
将r r r(p p p)分成了9份,区间是[0,9],r r r一定是取有效值,因为我们的图像的最长直线就是其对角线;然后将θ θθ以90°为步长分成了4个区间,当然你可以分成你想要的θ θθ区间。然后开始遍历 Canny 图像(很关键,我们在利用霍夫变换进行直线检测时,要先对图像进行边缘检测)。
【OpenCv】霍夫直线检测
遇到黑点直接跳过,我们只关注白点。然后将每个白点的坐标(x 0 x_0 x 0 ​,y 0 y_0 y 0 ​)和四个角度θ θθ(θ 1 = 90 ° θ_1=90°θ1 ​=90°,θ 2 = 180 ° θ_2=180°θ2 ​=180°,θ 3 = 270 ° θ_3=270°θ3 ​=270°,θ 4 = 360 ° θ_4=360°θ4 ​=360°)带入到r = x c o s θ + y s i n θ r=xcosθ+ysinθr =x cos θ+ys in θ中,得到对应的r 1 r_1 r 1 ​,r 2 r_2 r 2 ​,r 3 r_3 r 3 ​,r 4 r_4 r 4 ​,根据这些r r r值在对应区间进行投票。不断重复上述步骤直至图像遍历完毕。就可以根据r r r的投票数来确定直线。

3 优缺点

霍夫变换是一种全局性的检测方法,具有极佳的抗干扰能力,可 以很好地抑制数据点集中存在的干扰,同时还可以将数据点集拟合成多条直线。但是,霍夫变换的精度不容易控制,参数的微变就可能影响效果的大幅度变化,因此,不适合对拟合直线的精度要求较高的实际问题。同时,它所要求的巨大计算量使其处理速度很慢,从而限制了它在实时性要求很高的领域的应用

Original: https://blog.csdn.net/weixin_53598445/article/details/123341281
Author: 八岁爱玩耍
Title: 【OpenCv】霍夫直线检测

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/641791/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球