代码:https://github.com/jiayi-ma/LPM
本文在已经通过SIFT描述子等方法得到两个特征集合的候选匹配关系之后,剔除错误的匹配。
代价函数的构造
理想情况下的代价函数
对于变换是简单的刚性变换,并且不改变特征之间的距离的情况,代价函数定义如下:
I
∗
=
arg
min
I
C
(
I
;
S
,
λ
)
\mathcal{I}^{*}=\arg \min _{\mathcal{I}} C(\mathcal{I} ; S, \lambda)
I∗=argIminC(I;S,λ)
C
(
I
;
S
,
λ
)
=
∑
i
∈
I
∑
j
∈
I
(
d
(
x
i
,
x
j
)
−
d
(
y
i
,
y
j
)
)
2
+
λ
(
N
−
∣
I
∣
)
C(\mathcal{I} ; S, \lambda)=\sum_{i \in \mathcal{I}} \sum_{j \in \mathcal{I}}\left(d\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)-d\left(\mathbf{y}_{i}, \mathbf{y}_{j}\right)\right)^{2}+\lambda(N-|\mathcal{I}|)
C(I;S,λ)=i∈I∑j∈I∑(d(xi,xj)−d(yi,yj))2+λ(N−∣I∣)
其中
S
=
{
(
x
i
,
y
i
)
}
i
=
1
N
S=\left\{\left(\mathbf{x}_{i}, \mathbf{y}_{i}\right)\right\}_{i=1}^{N}
S={(xi,yi)}i=1N表示在两张图片上提取的特征;
I
\mathcal{I}
I表示内点集;
d
d
d表示两个特征值之间的距离,比如欧几里得距离;
∣
⋅
∣
|\cdot|
∣⋅∣表示集合的基数。
在理想情况下,第一项特征之间的距离应该为0。
考虑一般情况下的代价函数
在考虑到邻域结构在变换前后往往能够保持不变,对代价函数进行调整:
C
(
I
;
S
,
λ
)
=
∑
i
∈
I
1
2
K
(
∑
j
∣
x
j
∈
N
x
i
(
d
(
x
i
,
x
j
)
−
d
(
y
i
,
y
j
)
)
2
+
∑
j
∣
y
j
∈
N
y
i
(
d
(
x
i
,
x
j
)
−
d
(
y
i
,
y
j
)
)
2
)
+
λ
(
N
−
∣
I
∣
)
\begin{array}{l} C(\mathcal{I} ; S, \lambda)=\sum_{i \in \mathcal{I}} \frac{1}{2 K}\left(\sum_{j | \mathbf{x}_{j} \in \mathcal{N}_{\mathbf{x}_{i}}}\left(d\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)-d\left(\mathbf{y}_{i}, \mathbf{y}_{j}\right)\right)^{2}\right. \\ \left.+\sum_{j | \mathbf{y}_{j} \in \mathcal{N}_{\mathbf{y}_{i}}}\left(d\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)-d\left(\mathbf{y}_{i}, \mathbf{y}_{j}\right)\right)^{2}\right)+\lambda(N-|\mathcal{I}|) \end{array}
C(I;S,λ)=∑i∈I2K1(∑j∣xj∈Nxi(d(xi,xj)−d(yi,yj))2+∑j∣yj∈Nyi(d(xi,xj)−d(yi,yj))2)+λ(N−∣I∣)
其中,
N
x
\mathcal{N}_{\mathbf{x}}
Nx表示
x
\mathbf{x}
x的邻域,
K
K
K表示邻域的基数。引入对于对是否是内点的判断函数
p
i
p_{i}
pi,1表示是内点,0表示是外点。由于特征之间的距离在变换之后可能发生变化,将距离函数改为对于点是否在邻域中的判断函数:
d
(
x
i
,
x
j
)
=
{
0
,
x
j
∈
N
x
i
1
,
x
j
∉
N
x
i
,
d
(
y
i
,
y
j
)
=
{
0
,
y
j
∈
N
y
i
1
,
y
j
∉
N
y
i
d\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)=\left\{\begin{array}{ll}0, & \mathbf{x}_{j} \in \mathcal{N}_{\mathbf{x}_{i}} \\1, & \mathbf{x}_{j} \notin \mathcal{N}_{\mathbf{x}_{i}}\end{array}\right. , d\left(\mathbf{y}_{i}, \mathbf{y}_{j}\right)=\left\{\begin{array}{ll} 0, & \mathbf{y}_{j} \in \mathcal{N}_{\mathbf{y}_{i}} \\ 1, & \mathbf{y}_{j} \notin \mathcal{N}_{\mathbf{y}_{i}} \end{array}\right.
d(xi,xj)={0,1,xj∈Nxixj∈/Nxi,d(yi,yj)={0,1,yj∈Nyiyj∈/Nyi
这样就可以将代价函数简化为:
C
(
p
;
S
,
λ
)
=
∑
i
=
1
N
p
i
K
∑
j
∣
x
j
∈
N
X
i
d
(
y
i
,
y
j
)
+
λ
(
N
−
∑
i
=
1
N
p
i
)
C(\mathbf{p} ; S, \lambda)=\sum_{i=1}^{N} \frac{p_{i}}{K} \sum_{j | \mathbf{x}_{j} \in \mathcal{N}_{\mathbf{X}_{i}}} d\left(\mathbf{y}_{i}, \mathbf{y}_{j}\right)+\lambda\left(N-\sum_{i=1}^{N} p_{i}\right)
C(p;S,λ)=i=1∑NKpij∣xj∈NXi∑d(yi,yj)+λ(N−i=1∑Npi)
邻域拓扑改进
之前只考虑了是否在变换前都是邻域点,没有考虑邻域内变换的一致性。
v
i
\mathbf{v}_{i}
vi 表示
(
x
i
,
y
i
)
\left(\mathbf{x}_{i}, \mathbf{y}_{i}\right)
(xi,yi)对应的坐标差值,
v
i
\mathbf{v}_{i}
vi 和
v
j
\mathbf{v}_{j}
vj之间的差值定义为:
s
(
v
i
,
v
j
)
=
min
{
∣
v
i
∣
,
∣
v
j
∣
}
max
{
∣
v
i
∣
,
∣
v
j
∣
}
⋅
(
v
i
,
v
j
)
∣
v
i
∣
⋅
∣
v
j
∣
s\left(\mathbf{v}_{i}, \mathbf{v}_{j}\right)=\frac{\min \left\{\left|\mathbf{v}_{i}\right|,\left|\mathbf{v}_{j}\right|\right\}}{\max \left\{\left|\mathbf{v}_{i}\right|,\left|\mathbf{v}_{j}\right|\right\}} \cdot \frac{\left(\mathbf{v}_{i}, \mathbf{v}_{j}\right)}{\left|\mathbf{v}_{i}\right| \cdot\left|\mathbf{v}_{j}\right|}
s(vi,vj)=max{∣vi∣,∣vj∣}min{∣vi∣,∣vj∣}⋅∣vi∣⋅∣vj∣(vi,vj)
其中,
s
(
v
i
,
v
j
)
∈
[
−
1
,
1
]
s\left(\mathbf{v}_{i}, \mathbf{v}_{j}\right) \in[-1,1]
s(vi,vj)∈[−1,1],
(
⋅
,
⋅
)
(\cdot, \cdot)
(⋅,⋅)表示内积,值越大相似度越大,对相似度根据阈值进行二值化:
d
(
v
i
,
v
j
)
=
{
0
,
s
(
v
i
,
v
j
)
≥
τ
1
,
s
(
v
i
,
v
j
)
<
τ
d\left(\mathbf{v}_{i}, \mathbf{v}_{j}\right)=\left\{\begin{array}{l} 0, \quad s\left(\mathbf{v}_{i}, \mathbf{v}_{j}\right) \geq \tau \\ 1, \quad s\left(\mathbf{v}_{i}, \mathbf{v}_{j}\right)<\tau \end{array}\right.
d(vi,vj)={0,s(vi,vj)≥τ1,s(vi,vj)<τ
改进之后的代价函数为:
C
(
p
;
S
,
λ
,
τ
)
=
∑
i
=
1
N
p
i
K
(
∑
j
∣
x
j
∈
N
x
i
d
(
y
i
,
y
j
)
+
∑
j
∣
x
j
∈
N
x
i
,
y
j
∈
N
y
i
d
(
v
i
,
v
j
)
)
+
λ
(
N
−
∑
i
=
1
N
p
i
)
\begin{array}{l} C(\mathbf{p} ; S, \lambda, \tau)=\sum_{i=1}^{N} \frac{p_{i}}{K}\left(\sum_{j | \mathbf{x}_{j} \in \mathcal{N}_{\mathbf{x}_{i}}} d\left(\mathbf{y}_{i}, \mathbf{y}_{j}\right)\right. \\ \left.+\sum_{j | \mathbf{x}_{j} \in \mathcal{N}_{\mathbf{x}_{i}}, \mathbf{y}_{j} \in \mathcal{N}_{\mathbf{y}_{i}}} d\left(\mathbf{v}_{i}, \mathbf{v}_{j}\right)\right)+\lambda\left(N-\sum_{i=1}^{N} p_{i}\right) \end{array}
C(p;S,λ,τ)=∑i=1NKpi(∑j∣xj∈Nxid(yi,yj)+∑j∣xj∈Nxi,yj∈Nyid(vi,vj))+λ(N−∑i=1Npi)
多尺度邻域优化
由于特征在图像上分布不均匀,同时外点的比例也会变化,固定的K值不利于问题的求解。
为了解决这个问题,本文提出了多尺度邻域算法,改进之后的代价函数为:
C
(
p
;
S
,
λ
,
τ
)
=
∑
i
=
1
N
p
i
M
∑
m
=
1
M
1
K
m
(
∑
j
∣
x
j
∈
N
x
i
K
m
d
(
y
i
,
y
j
)
+
∑
j
∣
x
j
∈
N
x
i
K
m
,
y
j
∈
N
y
i
K
m
d
(
v
i
,
v
j
)
)
+
λ
(
N
−
∑
i
=
1
N
p
i
)
\begin{array}{l} C(\mathbf{p} ; S, \lambda, \tau)=\sum_{i=1}^{N} \frac{p_{i}}{M} \sum_{m=1}^{M} \frac{1}{K_{m}}\left(\sum_{j | \mathbf{x}_{j} \in \mathcal{N}_{\mathbf{x}_{i}}^{K_{m}}} d\left(\mathbf{y}_{i}, \mathbf{y}_{j}\right)\right. \\ \left.+\sum_{j | \mathbf{x}_{j} \in \mathcal{N}_{\mathbf{x}_{i}}^{K_{m}}, \mathbf{y}_{j} \in \mathcal{N}_{\mathbf{y}_{i}}^{K_{m}}} d\left(\mathbf{v}_{i}, \mathbf{v}_{j}\right)\right)+\lambda\left(N-\sum_{i=1}^{N} p_{i}\right) \end{array}
C(p;S,λ,τ)=∑i=1NMpi∑m=1MKm1(∑j∣xj∈NxiKmd(yi,yj)+∑j∣xj∈NxiKm,yj∈NyiKmd(vi,vj))+λ(N−∑i=1Npi)
从代价函数得到内点
对代价函数进行整理,得到下式:
C
(
p
;
S
,
λ
,
τ
)
=
∑
i
=
1
N
p
i
(
c
i
−
λ
)
+
λ
N
C(\mathbf{p} ; S, \lambda, \tau)=\sum_{i=1}^{N} p_{i}\left(c_{i}-\lambda\right)+\lambda N
C(p;S,λ,τ)=i=1∑Npi(ci−λ)+λN
其中:
c
i
=
∑
m
=
1
M
1
M
K
m
(
∑
j
∣
x
j
∈
N
x
i
K
m
d
(
y
i
,
y
j
)
+
∑
j
∣
x
j
∈
N
x
i
K
m
,
y
j
∈
N
y
i
K
m
d
(
v
i
,
v
j
)
)
\begin{aligned} c_{i}=& \sum_{m=1}^{M} \frac{1}{M K_{m}}\left(\sum_{j | \mathbf{x}_{j} \in \mathcal{N}_{\mathbf{x}_{i}}^{K_{m}}} d\left(\mathbf{y}_{i}, \mathbf{y}_{j}\right)\right.\\ &\left.+\sum_{j | \mathbf{x}_{j} \in \mathcal{N}_{\mathbf{x}_{i}}^{K_{m}}, \mathbf{y}_{j} \in \mathcal{N}_{\mathbf{y}_{i}}^{K_{m}}} d\left(\mathbf{v}_{i}, \mathbf{v}_{j}\right)\right) \end{aligned}
ci=m=1∑MMKm1⎝⎜⎛j∣xj∈NxiKm∑d(yi,yj)+j∣xj∈NxiKm,yj∈NyiKm∑d(vi,vj)⎠⎟⎞
显然可得:
p
i
=
{
1
,
c
i
≤
λ
0
,
c
i
>
λ
,
i
=
1
,
…
,
N
p_{i}=\left\{\begin{array}{l} 1, c_{i} \leq \lambda \\ 0, \quad c_{i}>\lambda \end{array}, i=1, \ldots, N\right.
pi={1,ci≤λ0,ci>λ,i=1,…,N
邻域构建
由于本文的假设是邻域匹配的一致性,但在外点比较多时,使用所有点构建邻域会破坏邻域一致性。为了改善这一点,本文使用迭代的方法构建邻域:
I
0
=
arg
min
I
C
(
I
;
S
,
λ
,
τ
)
\mathcal{I}_{0}=\arg \min _{\mathcal{I}} C(\mathcal{I} ; S, \lambda, \tau)
I0=argIminC(I;S,λ,τ)
I
∗
=
arg
min
I
C
(
I
;
I
0
,
S
,
λ
,
τ
)
\mathcal{I}^{*}=\arg \min _{\mathcal{I}} C\left(\mathcal{I} ; \mathcal{I}_{0}, S, \lambda, \tau\right)
I∗=argIminC(I;I0,S,λ,τ)
多次迭代的改善效果有限,本文认为
I
0
\mathcal{I}_{0}
I0已经可以作为内点集的良好近似。
时间和空间复杂度
算法的时间和空间复杂度分别为 O ( N log N ) O(N \log N) O(NlogN)和 O ( N ) O(N) O(N)