应用背景
已知目标区域由直线、曲线、圆等形状构成。目标检测问题转化为对直线、曲线、圆的检测问题 。
而Hough变换就是将图像由图像空间变换为参数空间。
原理
- 图像空间中的一条线对应Hough空间中的一个点
- 过点(x0,y0)和(x1,y1)的直线表示为Hough空间中两条线的交点
- 图像空间中的点对应Hough空间中的一条线
Hough变换的实现方式
- 线性变换
y i = m x i + b − > b = − x i m + y i y_i = mx_i+b \ \ -> b = -x_im+y_i yi=mxi+b −>b=−xim+yi
eg:
(1,0) → b = -m
(1,1) → b = -m + 1
(2,1) → b = -2m +1
但这种方式无法表示垂直线,此时m->∞
- 极坐标变换
r = xcosθ+ y sinθ
将图像空间的每个点(x,y)映射到(r,θ)空间中的正弦曲线
把在图像空间中检测直线的问题,转化为在极坐标参数空间中找通过点(r,θ)的最多正弦曲线数的问题。
Hough变换步骤
- 离散化θ
- 对每个坐标(x,y)和每个角度θ分别求r
- 统计(r,θ)出现的次数
- 最大次数对应的(r,θ)即为所求
对应的代码实现:
- 构建(参数空间)变换域累加器数组,并将
其初始化为0; - 读入一幅二值化图像,遍历图像像素点;
- 对每一个像素点,进行霍夫变换,按照r和θ的值在变换域累加器数组中的相应位置上加1;
- 遍历累加器数组,寻找局部极大值。
调用opencv中的HoughLinesP方法:
lines = cv.HoughLinesP(img, rho, theta, threshold, minLineLength=min_line_len, maxLineGap=max_line_gap)
检测⚪
图像空间上的点映射到参数空间中的一族圆锥的交点对应了圆心和半径
- 对参数空间适当量化,得到一个三维的累加器阵列,阵列中的每一个立方小格对应的参数离散值。
- 对图像空间所存在的圆进行边缘检测,将每个边缘点映射到 abr三维空间,同时将对应立方小格的累加器累加。
- 当对全部边缘点变换完成后,查找所有累加器的最大值,其对应坐标就是图像空间中圆的圆心和半径。