1 四个问题
1.1 要解决什么问题?
在不事先知道球体的位置和半径的前提下,从一对球面上的立体图像中定位多个光源位置和评估光源强度
1.2 用什么方法解决?
使用一对立体图像,利用其视角的变化将球面图像分割成两幅图像,一幅为Lambertian强度,另一个为高光强度。高光强度可用来确定光源的方向,lambertian图像模型可用来确定光源的强度
1.3 效果如何?
合成图像和真实图像的实验结果表明,该方法具有良好的鲁棒性
1.4 还存在什么问题?
2 论文概述
2.1 简介
- 应用:明暗恢复形状算法需要光的方向;提高分割算法的效果;如果光源信息可用,能无缝结合合成图像和真实图像
2.2 寻找球面的中心和半径
假定其为透视投影,左边摄像机位于(0,0,0)右边摄像机位于(b,0,0),其中b为基线。相机的方向为z轴正方向,第i束光的方向为(lxi,lyi,lzi)。假定球心(sx,sy,sz),半径为r,球体第i个边界点在左边摄影机成像平面为(lbzi,lbyi,f),右边为(rbzi,rbyi,f),球心S到通过任意边界点Bi的直线与相机中心C的距离为di为:
d
i
2
=
∥
C
S
∥
2
−
(
C
S
⋅
C
B
i
∥
C
B
i
∥
)
2
d_i^2=\left \| CS \right \|^2-(\frac{CS\cdot CB_i}{\left \| CB_i \right \|} )^2
di2=∥CS∥2−(∥CBi∥CS⋅CBi)2对于左右图像的边界点,可以得到:
l
d
i
2
=
∥
(
s
x
,
s
y
,
s
z
)
⋅
(
l
b
x
i
,
l
b
y
i
,
f
)
∥
(
l
b
x
i
,
l
b
y
i
,
f
)
∥
∥
ld_i^2=\left \| \frac{(s_x,s_y,s_z)\cdot (lbx_i,lby_i,f)}{\left \| (lbx_i,lby_i,f) \right \|}\right \|
ldi2=∥∥∥∥∥(lbxi,lbyi,f)∥(sx,sy,sz)⋅(lbxi,lbyi,f)∥∥∥∥
r
d
i
2
=
∥
(
s
x
−
b
,
s
y
,
s
z
)
⋅
(
r
b
x
i
−
b
,
r
b
y
i
,
f
)
∥
r
l
b
x
i
−
b
,
r
b
y
i
,
f
)
∥
∥
rd_i^2=\left \| \frac{(s_x-b,s_y,s_z)\cdot (rbx_i-b,rby_i,f)}{\left \| rlbx_i-b,rby_i,f) \right \|}\right \|
rdi2=∥∥∥∥∥rlbxi−b,rbyi,f)∥(sx−b,sy,sz)⋅(rbxi−b,rbyi,f)∥∥∥∥ldi和rdi分别为使用左右图像边界点计算的距离。利用边界跟踪算法,可以方便地检测出球面的边界点。由于焦距f和基线b都是已知的,所以距离ldi和rdi只取决于球中心的位置(sx,sy,sz)因此可以写成这三个未知数的函数:
l
d
i
2
=
h
i
(
s
x
,
s
y
,
s
z
)
ld_i^2=h_i(s_x,s_y,s_z)
ldi2=hi(sx,sy,sz)
r
d
i
2
=
g
i
(
s
x
,
s
y
,
s
z
)
rd_i^2=g_i(s_x,s_y,s_z)
rdi2=gi(sx,sy,sz)因此我们可以定义两个误差函数:
E
O
F
1
=
∑
(
h
i
(
s
x
,
s
y
,
s
z
)
−
r
2
)
2
EOF_1 = \sum (h_i(s_x,s_y,s_z)-r^2)^2
EOF1=∑(hi(sx,sy,sz)−r2)2
E
O
F
2
=
∑
(
g
i
(
s
x
,
s
y
,
s
z
)
−
r
2
)
2
EOF_2 = \sum (g_i(s_x,s_y,s_z)-r^2)^2
EOF2=∑(gi(sx,sy,sz)−r2)2将这两个误差函数最小化就可以得到球面中心和半径之间的两个关系
2.3 分离图像
假设光源与球面上各点之间的距离相对于球面半径足够大,切球面具有反射特性,则球面上某点的强度可表示为: I = I a m b i e n t + ∑ ( I d i f f u s e ( i ) + I s p e c u l a r ( i ) ) I=I_{ambient}+\sum(I_{diffuse}^{(i)}+ I_{specular}^{(i)}) I=Iambient+∑(Idiffuse(i)+Ispecular(i))其中Ilambient表示环境强度,Idiffuse(i)和Ispecular(i)表示第i束光源的漫反射强度和高光反射强度。观察可知:
- 环境强度和漫反射强度与视图方向无关,高光强度则高度依赖视图方向
- 立体图像对之间唯一的区别是视图方向的改变
因此我们可以通过从漫反射和环境强度中分理出高光强度来比较立体图像对的强度。由于已经得到球体的中心和半径,因此便可以唯一地确定球体表面每个点的三维位置,将球面上一个三维点投影到左右
图像平面上,得到两个图像像素。假设左图中的像素(i1,j1)对应于右图中的像素(i2,j2)可以得到两个像素的强度差
D
(
i
1
,
j
1
,
i
2
,
j
2
)
=
I
(
i
1
,
j
1
)
−
I
(
i
2
,
j
2
)
=
I
a
m
b
i
e
n
t
(
i
1
,
j
1
)
+
∑
(
I
d
i
f
f
u
s
e
(
i
)
(
i
1
,
j
1
)
+
I
s
p
e
c
u
l
a
r
(
i
)
(
i
1
,
j
1
)
)
−
I
a
m
b
i
e
n
t
(
i
2
,
j
2
)
+
∑
(
I
d
i
f
f
u
s
e
(
i
)
(
i
2
,
j
2
)
+
I
s
p
e
c
u
l
a
r
(
i
)
(
i
2
,
j
2
)
)
=
∑
(
I
s
p
e
c
u
l
a
r
(
i
)
(
i
1
,
j
1
)
−
I
s
p
e
c
u
l
a
r
(
i
)
(
i
2
,
j
2
)
)
D(i_1,j_1,i_2,j_2)=I(i_1,j_1)-I(i_2,j_2)=I_{ambient}(i_1,j_1)+\sum(I_{diffuse}^{(i)}(i_1,j_1)+ I_{specular}^{(i)}(i_1,j_1))-I_{ambient}(i_2,j_2)+\sum(I_{diffuse}^{(i)}(i_2,j_2)+ I_{specular}^{(i)}(i_2,j_2))=\sum(I_{specular}^{(i)}(i_1,j_1)-I_{specular}^{(i)}(i_2,j_2))
D(i1,j1,i2,j2)=I(i1,j1)−I(i2,j2)=Iambient(i1,j1)+∑(Idiffuse(i)(i1,j1)+Ispecular(i)(i1,j1))−Iambient(i2,j2)+∑(Idiffuse(i)(i2,j2)+Ispecular(i)(i2,j2))=∑(Ispecular(i)(i1,j1)−Ispecular(i)(i2,j2))根据Phong高光反射模型可知:
I
s
p
e
c
u
l
a
r
(
i
)
(
i
1
,
j
1
)
)
=
I
s
(
i
)
(
c
o
s
θ
1
)
n
s
I_{specular}^{(i)}(i_1,j_1))=I~s~^{(i)}(cosθ_1)^{n_s}
Ispecular(i)(i1,j1))=I s (i)(cosθ1)ns
I
s
p
e
c
u
l
a
r
(
i
)
(
i
2
,
j
2
)
)
=
I
s
(
i
)
(
c
o
s
θ
2
)
n
s
I_{specular}^{(i)}(i_2,j_2))=I~s~^{(i)}(cosθ_2)^{n_s}
Ispecular(i)(i2,j2))=I s (i)(cosθ2)ns
θ
1
+
θ
2
>
α
θ_1+θ_2>α
θ1+θ2>αIs(i)为一个常量表示第i束光源产生的最大高光强度,ns表示高光反射参数,θ1和他和θ2为视图向量V1和V2与反射向量R之间的夹角,α为V1和V2之间的夹角。如果ns和α足够大,球面在晃动,基线b足够大,我们定义一个小的数ε<α/2,则
(
c
o
s
θ
)
n
s
≈
{
1
i
f
θ
<
ε
0
o
t
h
e
r
w
i
s
e
(cosθ)^{n_s}\approx \left\{\begin{matrix} 1 &if θ<ε \\ 0 & otherwise \end{matrix}\right.
(cosθ)ns≈{10ifθ<εotherwise因此,有
I
s
p
e
c
u
l
a
r
(
i
)
(
i
1
,
j
1
)
≈
{
I
s
(
i
)
i
f
θ
1
<
ε
0
o
t
h
e
r
w
i
s
e
I_{specular}^{(i)}(i_1,j_1)\approx \left\{\begin{matrix} I_s^{(i)} &if θ_1<ε \\ 0 & otherwise \end{matrix}\right.
Ispecular(i)(i1,j1)≈{Is(i)0ifθ1<εotherwise
I
s
p
e
c
u
l
a
r
(
i
)
(
i
2
,
j
2
)
≈
{
I
s
(
i
)
i
f
θ
2
<
ε
0
o
t
h
e
r
w
i
s
e
I_{specular}^{(i)}(i_2,j_2)\approx \left\{\begin{matrix} I_s^{(i)} &if θ_2<ε \\ 0 & otherwise \end{matrix}\right.
Ispecular(i)(i2,j2)≈{Is(i)0ifθ2<εotherwiseθ1和θ2不能同时小于ε,故上市不可能同时小于Is(i)因此,我们可以推论出
i
f
D
(
i
)
(
i
1
,
j
1
,
i
2
,
j
2
)
=
0
,
I
s
p
e
c
u
l
a
r
(
i
)
(
i
1
,
j
1
)
=
0
a
n
d
I
s
p
e
c
u
l
a
r
(
i
)
(
i
2
,
j
2
)
=
0
if D^{(i)}(i_1,j_1,i_2,j_2)=0,I_{specular}^{(i)}(i_1,j_1)=0andI_{specular}^{(i)}(i_2,j_2)=0
ifD(i)(i1,j1,i2,j2)=0,Ispecular(i)(i1,j1)=0andIspecular(i)(i2,j2)=0
o
h
e
r
w
i
s
e
:
I
s
p
e
c
u
l
a
r
(
i
)
(
i
1
,
j
1
)
=
I
s
(
i
)
a
n
d
I
s
p
e
c
u
l
a
r
(
i
)
(
i
2
,
j
2
)
=
I
s
(
i
)
oherwise:I_{specular}^{(i)}(i_1,j_1)=I_s^{(i)}andI_{specular}^{(i)}(i_2,j_2)=I_s^{(i)}
oherwise:Ispecular(i)(i1,j1)=Is(i)andIspecular(i)(i2,j2)=Is(i)假定光源不是很密集则D(i)(i1,j1,i2,j2)互不干扰,则D(i1,j1,i2,j2)和D^(i)(i1,j1,i2,j2)具有相同的性质。我们定义thdisffuse和thspecular,如果D(i1,j1,i2,j2)<thdisffuse,则说明像素强度的高光分量会非常小,以至于像素强度只包含漫反射和坏境强度,我饿么将其称为称为Lambertian像素,只包含Lambertian像素的图像称为Lambertian图像。当
D(i1,j1,i2,j2)>thspecular时,高光强度应该是大的,我们将这些像素称为高光像素,只包含高光像素的图像为高光图像。
2.4 光源方向评估
我们可以通过将高光点按相对位置分组来确定哪对光斑来自同一光源:根据水平坐标对高光点进行排序,然后根据每个图像的垂直坐标进行,将高光点有效地配对在一起。高光点是一个包含许多像素的区域,我们必须在其中找到一个像素来表示这个区域:形心点。
P1,P2是由相同光源I分别在左右图像产生的高光点,S1和S2分别是P1和P2在球面上的对应点。一旦我们知道P1和P2,S1和S2的位置,我们可以计算法向量N1、N2和反射向量R1和R2,光源的方向向量I1和I2可以依据高光反射特性得到:
I
1
=
(
2
N
1
⋅
R
1
)
N
1
−
R
1
I_1=(2N_1\cdot R_1)N_1-R_1
I1=(2N1⋅R1)N1−R1
I
2
=
(
2
N
2
⋅
R
2
)
N
2
−
R
1
I_2=(2N_2\cdot R_2)N_2-R_1
I2=(2N2⋅R2)N2−R1光源方向向量
I
=
(
I
1
+
I
2
)
/
2
I=(I_1+I_2)/2
I=(I1+I2)/2
2.5 光源强度评估
球面上任一点(x,y,z)Lambertian强度为 I d i f f u s e ( x , y , z ) = I a + ∑ I d ( i ) ( N ( x , y , z ) ⋅ L ( i ) ) I_{diffuse}(x,y,z)=I_a+\sum Id^{(i)}(N(x,y,z)\cdot L^{(i)}) Idiffuse(x,y,z)=Ia+∑Id(i)(N(x,y,z)⋅L(i))其中 N ( x , y , z ) = ( x − s x y − s y z − s z ) N(x,y,z)=\begin{pmatrix} x-s_x\\ y-s_y\\ z-s_z \end{pmatrix} N(x,y,z)=⎝⎛x−sxy−syz−sz⎠⎞N为法向量,L(i)为第i个光源的方向向量,Ia为环境强度,Id(i)为第i个光源产生的强度。对于每一个像素(i1,j1)我们能得到球面上对应的点,因此每个像素点(i1,j1)的Lambertian强度为 I d i f f u s e ( i 1 , j 1 ) = I a + ∑ I d ( i ) ( N ( i 1 , j 1 ) ⋅ L ( i ) ) I_{diffuse}(i_1,j_1)=I_a+\sum Id^{(i)}(N(i_1,j_1)\cdot L^{(i)}) Idiffuse(i1,j1)=Ia+∑Id(i)(N(i1,j1)⋅L(i))由于(sx,sy,sz)已知,故,N(i1,j1)能够被计算出因此我们有i+1个未知数,Ia和Id(i),因此我们得到误差函数 E O F 3 = ∑ [ I d i f f u s e ( i 1 , j 1 ) − I a − ∑ I d ( i ) ( N ( i 1 , j 1 ) ⋅ L ( i ) ) ] 2 EOF_3=\sum [I_{diffuse}(i_1,j_1)-I_a-\sum Id^{(i)}(N(i_1,j_1)\cdot L^{(i)})]^2 EOF3=∑[Idiffuse(i1,j1)−Ia−∑Id(i)(N(i1,j1)⋅L(i))]2通过设置未知数的初值和搜索范围来提高极小化问题的收敛性和结果的准确性。例如强度应该是正的,若强度小于0是对误差函数设置惩罚值。
2.6 实验
对于thLambertian和thspecular的选择:
- 如果thLambertian的值过小,意味着为了成为一个漫反射像素,左右图像对应像素的强度差距应该小,也意味着漫反射像素为了满足情况应该低噪声。折中的办法是减少候选像素的数量
- 如果thspecluar的值过大,意味着为了成为一个高光像素,左右图像中对应像素之间的强度差异应该更大,这将导致一个更小的高光点和消除重叠的问题,但它也有可能导致一些高光点消失。