直线检测
图像空间的直线可以在霍夫空间中表示为一个点,同样的,图像空间的点可以在霍夫空间表示为一条直线。而图像空间多个点在霍夫空间就表示为多条直线。
观察上图发现,如果在图像空间中的点共线,那么在霍夫空间中对应的直线将相交,交点即为图像空间中直线的斜率
k
k
k和截距
q
q
q。
当在图像空间中存在多个直线时,那么在霍夫空间就会有多个交点。采用投票方法计算交点得票(处理误差可使用NMS),当得票大于给定阈值,则认为在图像空间中检测到直线。
但是使用斜距式表示直线存在缺点:当直线存在
x
x
x轴时,斜率
∞
\infty
∞
所以采用极坐标表示
其中
ρ
>
0
\rho>0
ρ>0
两种方法对比:
以上图片来自博文:霍夫变换
圆检测
类比直线检测,直线需要2个参数表示,而圆需要3个参数,圆心
(
a
,
b
)
(a,b)
(a,b)和半径
r
r
r。
我们先假设已经确定
r
r
r,那么在图像空间中圆上的点
p
p
p,在霍夫空间中得到以
p
p
p圆心,半径为
r
r
r的圆,那么这些圆相交次数最多的点即为圆心。
以上图片来视频:How Circle Hough Transform works
但是半径 r r r如果不确定,搜索半径将会增加一个指数的复杂度,应用价值不高。这种方法又被称为:标准霍夫圆变换。
在OpenCV中使用的是霍夫梯度法,其核心思想是:求圆心和半径
求圆心:
图像空间中圆上的点的梯度方向(下面会解释)会相交于一点,这一点即为圆心
点
f
f
f的梯度为:
∇ f = [ ∂ f ∂ x , ∂ f ∂ y ] T \nabla f=\left[\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}\right]^{T} ∇f=[∂x∂f,∂y∂f]T
求偏导使用sober算子:
分别计算x和y上的偏导。
和直线检测一样,梯度向量相交最多的点作为圆心:
求半径:在求得圆心后,计算图像空间中圆上的点到各个圆心的距离,对距离进行投票,投票最多的则为这个圆心对应的半径
在求得半径后,搜索空间降为2。
以上图片来视频:3.2 hough circle(霍夫圆变换)
PClines检测直线
论文:PClines – Line Detection Using Parallel Coordinates Brno University of Technology(CVPR 2011)
PClines中的PC表示为Parallel coordinates,Parallel coordinates是为了可视化表示高维数据,列如5维空间中的一个点
C
(
C
1
,
C
2
,
C
3
,
C
4
,
C
5
)
C(C_{1},C_{2},C_{3},C_{4},C_{5})
C(C1,C2,C3,C4,C5),表示为一条折线(4(=5-1)条直线组成):
笛卡尔坐标系中用齐次坐标表示点 ( x , y , w ) (x,y,w) (x,y,w),以此表示无限远的点 ( 1 , 1 , 0 ) = ( ∞ , ∞ , 0 ) (1,1,0)=(\infin,\infin,0) (1,1,0)=(∞,∞,0)
若点共线,这在
p
p
p空间(PC空间)中直线会相交于点
ℓ
ˉ
\bar{\ell}
ℓˉ表示
c
c
c空间(笛卡尔坐标系空间,图像空间)中直线
ℓ
\ell
ℓ:
x ′ x^{\prime} x′和 y ′ y^{\prime} y′的中间距离为 d d d
这一过程和截距参数,极坐标参数的霍夫变换映射一样点到线和线到点,不过变换参数不一样:
[]表示的是点,()表示的是直线
点(
c
c
c)->线(
p
p
p):
S
d
p
(
[
x
,
y
,
w
]
)
=
(
−
x
+
y
,
−
d
w
,
d
x
)
\mathcal{S}_{d}^{p}([x, y, w])=(-x+y,-d w, d x)
Sdp([x,y,w])=(−x+y,−dw,dx)
图像空间中一点(x/w, y/w,1)在ST空间表示为2点(0,x/w)和(d,y/w)。两点式带入。
线(
c
c
c)->点(
p
p
p):
S
d
l
(
(
a
,
b
,
c
)
)
=
[
d
b
,
−
c
,
a
+
b
]
\mathcal{S}_{d}^{l}((a, b, c))=[d b,-c, a+b]
Sdl((a,b,c))=[db,−c,a+b]
图像中的直线抽取2个点,在ST空间表示2条直线,2直线必然相交,交点即为所求。
当在
c
c
c空间中直线的斜率>0,那么在
p
p
p空间中的有限的
x
′
,
y
′
x^{\prime},y^{\prime}
x′,y′区间是无法得到交点。所以使用
T
T
T表示:
综上,
p
p
p空间由
S
,
T
S,T
S,T组成。且表示的有限空间:
−
d
≤
u
≤
d
−
max
(
W
2
,
H
2
)
≤
v
≤
max
(
W
2
,
H
2
)
\begin{aligned} -d & \leq u \leq d \\ -\max \left(\frac{W}{2}, \frac{H}{2}\right) & \leq v \leq \max \left(\frac{W}{2}, \frac{H}{2}\right) \end{aligned}
−d−max(2W,2H)≤u≤d≤v≤max(2W,2H)
检测直线示例:
CHT+PClines消失点检测
论文:Real Projective Plane Mapping for Detection of Orthogonal Vanishing Points(BMVC 2013)
CHT(Cascaded Hough Transform),级联霍夫变换,顾名思义就是在进行一次霍夫变换后再进行霍夫变换。
借鉴CHT实现,进行两次变换,分别是是
c
→
S
d
p
d
→
S
D
p
D
c \rightarrow^{{S}_{d}} p_d \rightarrow^{{S}_{D}} p_D
c→Sdpd→SDpD综合起来就是
c
→
S
S
d
D
p
D
c \rightarrow^{{SS}_{dD}} p_D
c→SSdDpD。
之前提到
S
S
S对应的还有一个变换是
T
T
T,那么
S
T
ST
ST可以有4种组合:
S
S
d
D
p
(
[
x
,
y
,
w
]
)
=
(
S
D
l
∘
S
d
p
)
(
[
x
,
y
,
w
]
)
=
[
−
d
D
w
,
−
d
x
,
−
x
+
y
−
d
w
]
S
T
d
D
p
(
[
x
,
y
,
w
]
)
=
(
S
D
l
∘
T
d
p
)
(
[
x
,
y
,
w
]
)
=
[
−
d
D
w
,
−
d
x
,
−
x
+
y
+
d
w
]
T
S
d
D
p
(
[
x
,
y
,
w
]
)
=
(
T
D
l
∘
S
d
p
)
(
[
x
,
y
,
w
]
)
=
[
−
d
D
w
,
−
d
x
,
x
+
y
−
d
w
]
T
T
d
D
p
(
[
x
,
y
,
w
]
)
=
(
T
D
l
∘
T
d
p
)
(
[
x
,
y
,
w
]
)
=
[
−
d
D
w
,
−
d
x
,
x
+
y
+
d
w
]
\begin{aligned} {S} {S}_{d D}^{p}([x, y, w]) &=\left({S}_{D}^{l} \circ {S}_{d}^{p}\right)([x, y, w])=[-d D w,-d x,-x+y-d w] \\ {S} {T}_{d D}^{p}([x, y, w]) &=\left({S}_{D}^{l} \circ {T}_{d}^{p}\right)([x, y, w])=[-d D w,-d x,-x+y+d w] \\ {T} {S}_{d D}^{p}([x, y, w]) &=\left({T}_{D}^{l} \circ {S}_{d}^{p}\right)([x, y, w])=[-d D w,-d x, x+y-d w] \\ {T} {T}_{d D}^{p}([x, y, w]) &=\left({T}_{D}^{l} \circ {T}_{d}^{p}\right)([x, y, w])=[-d D w,-d x, x+y+d w] \end{aligned}
SSdDp([x,y,w])STdDp([x,y,w])TSdDp([x,y,w])TTdDp([x,y,w])=(SDl∘Sdp)([x,y,w])=[−dDw,−dx,−x+y−dw]=(SDl∘Tdp)([x,y,w])=[−dDw,−dx,−x+y+dw]=(TDl∘Sdp)([x,y,w])=[−dDw,−dx,x+y−dw]=(TDl∘Tdp)([x,y,w])=[−dDw,−dx,x+y+dw]
在
c
c
c空间中,对于不同象限的点对应不同
S
T
ST
ST组合,转到
p
D
p_D
pD空间后,可以得到有限三角形区域:
列如在
c
c
c空间第4象限的点:
P
=
[
x
,
y
,
1
]
,
x
≥
0
,
y
≤
0
P=[x, y, 1], x \geq 0, y \leq 0
P=[x,y,1],x≥0,y≤0,在
p
D
p_D
pD空间表示为
S
S
d
D
p
(
P
)
=
[
−
d
D
,
−
d
x
,
−
x
+
y
−
d
]
\mathcal{S S}_{d D}^{p}(P)=[-d D,-d x,-x+y-d]
SSdDp(P)=[−dD,−dx,−x+y−d],又因为:
d
,
D
>
0
,
x
≥
0
⇒
−
d
D
<
0
,
−
d
x
≤
0
x
≥
0
,
y
≤
0
,
d
>
0
⇒
−
x
+
y
−
d
<
0
⇒
−
d
D
−
x
+
y
−
d
>
0
⇒
−
d
x
−
x
+
y
−
d
≥
0
\begin{aligned} d, D>0, x \geq 0 & \Rightarrow-d D<0,-d x \leq 0 \\ x \geq 0, y \leq 0, d>0 & \Rightarrow-x+y-d<0 \\ & \Rightarrow \frac{-d D}{-x+y-d}>0 \\ & \Rightarrow \frac{-d x}{-x+y-d} \geq 0 \end{aligned}
d,D>0,x≥0x≥0,y≤0,d>0⇒−dD<0,−dx≤0⇒−x+y−d<0⇒−x+y−d−dD>0⇒−x+y−d−dx≥0
所以在
p
D
p_D
pD空间表示为第1象限的点,同时可以证明有边界
ℓ
b
=
(
d
,
D
,
−
d
D
)
\ell_{b}=(d, D,-d D)
ℓb=(d,D,−dD):
(
d
,
D
,
−
d
D
)
⋅
[
−
d
D
−
x
+
y
−
d
,
−
d
x
−
x
+
y
−
d
,
1
]
=
−
d
D
y
−
x
+
y
−
d
≤
0
(d, D,-d D) \cdot\left[\frac{-d D}{-x+y-d}, \frac{-d x}{-x+y-d}, 1\right]=\frac{-d D y}{-x+y-d} \leq 0
(d,D,−dD)⋅[−x+y−d−dD,−x+y−d−dx,1]=−x+y−d−dDy≤0
在
c
c
c空间的直线
(
a
,
b
,
c
)
c
(a, b, c)_c
(a,b,c)c在
p
D
p_D
pD空间表示为:
α
=
sgn
(
a
b
)
,
β
=
sgn
(
b
c
)
,
γ
=
sgn
(
a
c
)
(
a
,
b
,
c
)
c
→
[
α
a
c
+
γ
a
,
−
α
c
c
+
γ
a
]
,
[
b
c
+
β
b
,
0
]
,
[
0
,
b
a
+
α
b
]
,
[
−
α
a
c
+
γ
a
,
α
c
c
+
γ
a
]
\begin{array}{l} \alpha=\operatorname{sgn}(a b), \quad \beta=\operatorname{sgn}(b c), \quad \gamma=\operatorname{sgn}(a c) \\ (a, b, c)_{c} \rightarrow\left[\frac{\alpha a}{c+\gamma a}, \frac{-\alpha c}{c+\gamma a}\right],\left[\frac{b}{c+\beta b}, 0\right],\left[0, \frac{b}{a+\alpha b}\right],\left[\frac{-\alpha a}{c+\gamma a}, \frac{\alpha c}{c+\gamma a}\right] \end{array}
α=sgn(ab),β=sgn(bc),γ=sgn(ac)(a,b,c)c→[c+γaαa,c+γa−αc],[c+βbb,0],[0,a+αbb],[c+γa−αa,c+γaαc]
检测消失点示例:
因此该方法相比以往先检测直线再基于检测到直线检测消失点的2步方法少了对直线进行处理的步骤。
注意:对于在2D图像上检测到消失点还需要在3D空间中进行正交处理。