Hough变换的直线检测基础

一、Hough 变换(直线)

Hough变换是依赖于投票机制的,在参数空间统计原空间下点的贡献值(投票)得到了累计值,累积量的峰值确定了所要的检测目标 1。以直线为例,在二维平面X - Y 中,直线方程可以描述为点斜式:
y = k x + b y=kx+b y=kx+b
若是已知直线的(k,b)那么也就唯一的确定了平面上的直线。我们把(k,b)所组成的空间理解为参数空间(K,B)。过X-Y平面上的一点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)有无数条直线,对应参数空间有无数个点(k,b),他们满足
y 0 = k x 0 + b y_0 = kx_0 +b y0=kx0+b也就是参数空间(K,B)上的一条直线。由于直线的斜率可能取值很大,不利于统计计算。如下图所示,直线可以用 θ , r \theta,r θ,r唯一确定。

Hough变换的直线检测基础_第1张图片

所以对X-Y平面上的直线方程改为:
r = x c o s θ + y s i n θ r = x cos\theta + y sin\theta r=xcosθ+ysinθ此时,平面X-Y上的一条直线对应参数空间 h ( r , θ ) h(r,\theta) h(r,θ)上的一个点,过X-Y平面上的一个点的所有直线,在参数空间 h ( r , θ ) h(r,\theta) h(r,θ)上得到一条曲线。
注意:

  • 1、上式虽然可以由点的极坐标形式推导得出,但是 ( r , θ ) (r,\theta) (r,θ)并非极坐标系,仍是笛卡尔坐标系下得到的参数。
  • 2、 r r r是原点到直线的距离,并不会取负值,但是由于 θ \theta θ取值范围的原因, r r r会有负数的情况。

二、图像变换实现步骤

  • 1 、对图像做二值化或者取边缘信息,得到图像 I m a g e Image Image,这里假设图像大小为640*480.
  • 2、设定参数的取值范围: θ \theta θ 取值 [ − 90 , 89 ) [-90,89) [90,89) r r r 取值为 [ − 800 , 800 ] [-800,800] [800,800](直觉上并不会取到-800) r m a x = x m a x 2 + y m a x 2 r_{max} = \sqrt{x_{max}^2 + y_{max}^2} rmax=xmax2+ymax2
  • 3、设 H ( r , θ ) H(r,\theta) H(r,θ)存储点 ( r , θ ) (r,\theta) (r,θ)出现的次数。
  • 3、遍历二值化图像 I m a g e Image Image,得到第一个非零点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0),带入到:
    r = x 0 c o s θ + y 0 s i n θ r = x_0 cos\theta + y_0 sin\theta r=x0cosθ+y0sinθ θ \theta θ 取值 [ − 90 , 89 ) [-90,89) [90,89)间隔1,得到一系列点 ( r , θ ) (r,\theta) (r,θ),在相应的 H ( r , θ ) H(r,\theta) H(r,θ)加一。依次处理整幅图片。

三、Opencv 下的测试结果

Hough变换的直线检测基础_第2张图片
Hough变换的直线检测基础_第3张图片


  1. https://en.wikipedia.org/wiki/Hough_transform ↩︎

你可能感兴趣的:(Vision)