OpenCV 中的霍夫变换

简介#

霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特征的集合作为霍夫变换的结果

霍夫线变换#

霍夫变换中最简单的是从二值图像中检测直线/线段,霍夫变换前,需要先检出图像边缘

霍夫变换的主要优点是能容忍特征边界描述中的间隙,并且相对不受图像噪声的影响

  • 一条直线在二维空间中可以由一个方程表示

在笛卡尔坐标系下,直线可以由 斜率 kk截距 bb 表示

y=kx+by = kx + b
  • 当直线垂直的时候,斜率不存在(无限大),kk 的值有可能无限大,不利于计算,所以将直线转为参数方程表示

在极坐标下,直线可以由 极角 θ\theta极径 rr 表示

y=(cosθsinθ)x+(rsinθ)y = (-\frac{cos\theta}{sin\theta})x + (\frac{r}{sin\theta})

转换一下可以得到

r=xcosθ+ysinθr = xcos\theta + ysin\theta

对于一个点 (x0,y0)(x_{0}, y_{0}) ,可以用 (r0,θ)(r_{0} , \theta) 表示通过这个点的所有的直线定义为

r0=x0cosθ+y0sinθr_{0}=x_{0}cos\theta+y_{0}sin\theta

我们在极坐标空间中对极径角绘制所有的直线,将会得到一条正弦曲线,极径 rr 越大,曲线的振幅越大

x0=8x_{0} = 8y0=6y_{0} = 6 时,绘制出如下曲线

其中 r>0r > 00<θ<2π0 < \theta < 2\pi

每个点对应一条曲线,如果两个或多个不同的曲线在图象中相交时,意味着这两个点都属于同一条直线

例如对于 (x0=8,y0=6)(x_{0} = 8,y_{0} = 6)(x1=4,y1=9)(x_{1}=4,y_{1}=9)(x2=12,y2=3)(x_{2}=12,y_{2}=3) 三个点,他们的曲线如下

🔥
  • 寻找共线点的问题可以转变为寻找曲线是否有共同的交点
  • 更多的曲线相交,代表直线上的点越多,通常,我们可以定义检测一条线所需的最小交叉点数量的阈值

标准霍夫变换 cv::HoughLines()#

参考#