霍夫变换原理

看到网上一堆讲原理讲得乱七八糟还抄袭的博客,把自己看懵了……转手一wiki发现写得很清晰,这里贴上来供学习。

对于直角坐标系(笛卡尔坐标系)平面的一条直线的斜截式:
y = k 0 x + b 0 y=k_0 x+b_0 y=k0x+b0

这里将 ( k 0 , b 0 ) (k_0 ,b_0 ) (k0,b0)看做参数空间 ( k , b ) (k,b) (k,b) 中的一点,我们知道当直线与x轴垂直时,k为无穷大,因此斜截式无法表示全部的直线。用Hesse normal form来表示直线的参数这里是将参数的表示换了,而不是将直线从直角坐标系换到极坐标系

所以: k = − c o s θ s i n θ k =-\frac{cos\theta} {sin\theta } k=sinθcosθ , b = r s i n θ b = \frac{r}{sin\theta} b=sinθr ,代入原斜截式方程得到方程的表达式如下:

y = − c o s θ s i n θ x + r s i n θ y = -\frac{cos\theta}{sin\theta} x + \frac{r}{sin\theta} y=sinθcosθx+sinθr

整理可得 r = x c o s θ + y s i n θ r=xcos\theta + ysin\theta r=xcosθ+ysinθ,因此,给定一个点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0),通过该点的所有直线的集合(参数是斜率和截距,这里用ρ、θ表示)表示为:

r = x 0 c o s θ + y 0 s i n θ = x o 2 + y 0 2 ( x 0 x 0 2 + y 0 2 + y 0 x 0 2 + y 0 2 ) = x 0 2 + y 0 2 ( c o s γ c o s θ + s i n γ s i n θ ) = x 0 2 + y 0 2 c o s ( θ − γ ) r=x_0cos\theta_ + y_0sin\theta\\=\sqrt{x_o^2+y_0^2}(\frac{x_0}{\sqrt{x_0^2+y_0^2}}+\frac{y_0}{\sqrt{x_0^2+y_0^2}})\\=\sqrt{x_0^2+y_0^2}(cos\gamma cos\theta + sin\gamma sin\theta ) \\= \sqrt{x_0^2+y_0^2}cos(\theta-\gamma) r=x0cosθ+y0sinθ=xo2+y02 (x02+y02 x0+x02+y02 y0)=x02+y02 (cosγcosθ+sinγsinθ)=x02+y02 cos(θγ)

因此,判断两个点是否共线的问题,在经过霍夫变换之后,变成判断通过两点的所有直线是否相交的问题。又因为通过一个点的所有直线在(r,θ)平面上代表一条曲线,画出任意两个点的两条曲线,若相交,就表示这两个点在同一条直线上。

你可能感兴趣的:(OpenCV)