论文:Decomposing Images into Layers via RGB-space Geometry 发表于ACM TOG 2016,是第一个基于RGB凸包的调色板图像编辑算法,我近两年的研究跟本文有很大关系,因此这里再次回顾一下这篇经典论文。
本文目标是对于给定图像提取出调色板,计算对应的半透明图层,并期望通过这些图层完美重建出输入图像,下图展示了该方法的输入和输出。
算法分为两步:1)计算初始调色板和简化;2)计算调色板对应的半透明图层. 下面做详细分析.
初始调色板的求解过程如下图所示,分为三个步骤:
那么,如何简化上图第3列所示的初始凸包呢?本文通过缩边的方式对原始凸包进行简化,迭代的将边缩减为点,每次缩边操作使得体积增加。如下图所示,主要分为三步:
那么,对于某一条候选边,如何计算缩边带来的体积增量呢?
对于每条候选边
v
i
v
j
v_iv_j
vivj,收缩为点
v
v
v 后体积的增量如上图第3列所示,连接
v
v
i
vv_i
vvi 和
v
v
j
vv_j
vvj, 增加的体积可剖分为多个四面体,上图第4列就是上图第3列正前方的四面体。该四面体的体积可表示为:
A
/
3
⋅
n
⋅
(
v
−
v
i
)
(0)
A/3\cdot \mathbf{n}\cdot ({v}-{v_i})\tag0
A/3⋅n⋅(v−vi)(0)
其中,
A
A
A表示
△
v
v
j
v
k
\triangle vv_jv_k
△vvjvk的面积,
n
\mathbf{n}
n表示
△
v
v
j
v
k
\triangle vv_jv_k
△vvjvk朝外的法向量,
v
{v}
v表示待求顶点。那么,整体的体积增量就是多个四面体的体积,我们的目标是得到一个使得整体体积增加最小的
v
{v}
v, 因此可以通过最下化如下所式的能量函数求解:
v
=
a
r
g
m
i
n
∑
A
3
n
⋅
(
v
−
v
x
)
s
.
t
.
A
3
n
⋅
(
v
−
v
x
)
>
0
(1)
v = argmin\sum\frac{A}{3}\mathbf{n}\cdot(v-v_x) \ \ s.t. \ \frac{A}{3}\mathbf{n}\cdot(v-v_x) > 0\tag1
v=argmin∑3An⋅(v−vx) s.t. 3An⋅(v−vx)>0(1)
其中,
v
x
v_x
vx 可能是
v
i
v_i
vi 或
v
j
v_j
vj, 根据不同的四面体而定,上述能量函数可以通过线性优化求解。
凸包简化效果如下图所示,凸包简化到什么程度由用户决定, 若用户决定简化到5个顶点,则得到左下角所示的调色板.
本文使用Porter-Duff “Over” 颜色混合模式进行颜色混合,也就是常用的alpha-blending, 其颜色混合模式为:
A
f
t
e
r
=
P
a
i
n
t
⋅
α
+
B
e
f
o
r
e
⋅
(
1
−
α
)
(2)
After = Paint \cdot \alpha + Before \cdot (1-\alpha)\tag2
After=Paint⋅α+Before⋅(1−α)(2)
其中,
P
a
i
n
t
Paint
Paint 表示前景图层,
B
e
f
o
r
e
Before
Before 是背景图层,
A
f
t
e
r
After
After 是背景和前景混合后的颜色. 可以看出合成的颜色跟图层的顺序和不透明度有关. 本文采用这种颜色混合模式,也就是说,图像中任意像素的颜色可以通过给定的顺序的调色板颜色 和 不透明度 经alpha-blending混合得到。 下图给出了这个问题的描述:
本文图层的概念:图层数目跟调色板颜色数目相同,图层的尺寸跟输入图像一致,图层中每个位置的数值
a
p
i
a^i_p
api 表示合成像素
p
p
p的颜色
C
i
C_i
Ci对应的不透明度,
0
(
黑色
)
<
=
a
p
i
<
=
1
(白色)
0(黑色) <= a^i_p <= 1(白色)
0(黑色)<=api<=1(白色).
我们注意到,alpha-blending这种颜色混合模式跟图层的顺序有直接关系,针对给定调色板
C
=
C
1
,
C
2
,
.
.
.
C
n
C={C_1,C_2,...C_n}
C=C1,C2,...Cn, 颜色排列有𝑛!种. 如下图所示,给定不同的调色板顺序得到的图层均可重建图像.因此, 本文由用户指定调色板颜色顺序.
但即便如此,对于给定的调色板顺序,每个像素点关于各个调色板颜色对应的不透明度仍有无穷解。也就是说,针对任一点
p
p
p, 它可能被多种方式进行重建:
p
=
A
l
p
h
a
B
l
e
n
d
i
n
g
(
{
C
1
,
a
p
1
}
,
{
C
2
,
a
p
2
}
,
.
.
.
{
C
n
,
a
p
n
}
)
=
A
l
p
h
a
B
l
e
n
d
i
n
g
(
{
C
1
,
b
p
1
}
,
{
C
2
,
b
p
2
}
,
.
.
.
{
C
n
,
b
p
n
}
)
.
.
.
p = AlphaBlending(\{C_1,a^1_p\},\{C_2,a^2_p\},...\{C_n,a^n_p\}) = AlphaBlending(\{C_1,b^1_p\},\{C_2,b^2_p\},...\{C_n,b^n_p\})...
p=AlphaBlending({C1,ap1},{C2,ap2},...{Cn,apn})=AlphaBlending({C1,bp1},{C2,bp2},...{Cn,bpn})...
其中,
a
p
i
a^i_p
api 表示合成
p
p
p 的调色板颜色
C
i
C_i
Ci对应的不透明度,
{
a
p
i
}
\{a^i_p\}
{api} 和
{
b
p
i
}
\{b^i_p\}
{bpi} 表示两组不同的解,这种解其实有无穷组. 为了说明这个问题,如下所示,我们给定一个凸包(调色板)并给定颜色顺序
c
0
,
c
1
,
c
2
,
c
3
,
c
4
{c_0,c_1,c_2,c_3,c_4}
c0,c1,c2,c3,c4, 以及待合成的d顶点(颜色)
P
P
P, 下图中的两条路径对应了两种不同的解.
那么,对于给定的调色板颜色顺序,如何确定每个像素的对应的多个不透明度呢?本文提出两种策略, 分别是1)基于广义重心坐标的算法和 2)基于能量优化的算法。接下来,对这两种算法简单介绍.
我们注意到alpha blending的颜色混合模式:
I
p
n
=
C
n
⋅
α
p
n
+
I
p
n
−
1
⋅
(
1
−
α
p
n
)
(3)
I^n_p = C_n \cdot \alpha^n_p + I^{n-1}_p \cdot (1-\alpha^n_p)\tag3
Ipn=Cn⋅αpn+Ipn−1⋅(1−αpn)(3)
可以等效的表示为:
I
p
n
=
∑
i
=
1
n
w
i
C
i
(4)
I^n_p = \sum^{n}_{i=1}w_iC_i\tag4
Ipn=i=1∑nwiCi(4)
我们知道(3)(4)均对应无穷解,但是如果我们能通过别的方法确定(3)的唯一一组权重,那么我们可以恢复出(2)的不透明度:
α
p
i
=
{
1
−
∑
j
=
1
i
−
1
w
j
∑
j
=
1
i
w
j
,
∑
j
=
1
i
w
j
>
0
0
,
𝑜
𝑡
h
𝑒
𝑟
𝑤
𝑖
𝑠
𝑒
(5)
\alpha^i_p=\left\{
本文采用ASAP(As sparse as possible )的算法对凸包内部的像素点进行插值,具体而言,将凸包进行四面体剖分,每个像素点𝑃可以唯一表示成所在四面体顶点𝐴𝐵𝐶𝐷的凸组合:
𝑃
=
𝑤
𝐴
𝐴
+
𝑤
𝐵
𝐵
+
𝑤
𝐶
𝐶
+
𝑤
𝐷
𝐷
,
𝑤
𝐴
+
𝑤
𝐵
+
𝑤
𝐶
+
𝑤
𝐷
=
1
𝑃=𝑤_𝐴 𝐴 +𝑤_𝐵 𝐵+𝑤_𝐶 𝐶+𝑤_𝐷 𝐷, 𝑤_𝐴+𝑤_𝐵+𝑤_𝐶+𝑤_𝐷=1
P=wAA+wBB+wCC+wDD,wA+wB+wC+wD=1
当然,也可以使用别的广义重心坐标算法,比如:
[1] Mean value coordinates for closed triangular meshes[J]. Ju et.al. ACM Transactions on Graphics, 2005.
[2] Local Barycentric Coordinates, Zhang et.al. ACM Transactions on Graphics, 2014.
本质上,公式(2)是一个欠约束的问题,当调色板的颜色数目超过图像的颜色通道时必然有无穷解,为此可以构造带约束的能量优化函数,并通过最小化能量函数求解不同明度:
E
=
w
r
E
r
+
w
o
E
o
+
w
s
E
s
(6)
E = w_rE_r + w_oE_o + w_sE_s\tag6
E=wrEr+woEo+wsEs(6)
其中,
E
r
E_r
Er 表示重建误差,定义如下所示,
K
K
K表示颜色通道数目.
E
r
=
1
K
∣
∣
I
p
n
−
I
p
∣
∣
2
(7)
E_r = \frac{1}{K}||I^n_p-I_p||^2\tag7
Er=K1∣∣Ipn−Ip∣∣2(7)
其中,
E
o
E_o
Eo 表示不透明度约束,目的是惩罚较大的不透明度,定义为:
E
o
=
1
n
∑
i
=
1
n
−
(
1
−
α
i
)
2
(8)
E_o=\frac{1}{n}\sum^n_{i=1}-(1-\alpha_i)^2\tag8
Eo=n1i=1∑n−(1−αi)2(8)
其中,
E
s
E_s
Es 表示光滑性约束,目的是保证相似的像素具有相似的不透明度,定义为:
E
s
=
1
n
∑
i
=
1
n
−
(
∇
α
i
)
2
(9)
E_s=\frac{1}{n}\sum^n_{i=1}-(\nabla \alpha_i)^2\tag9
Es=n1i=1∑n−(∇αi)2(9)
然后,直接求解即可得到多个图层,per-pixel的不透明度。
1)图层分解示例:这里的图层是 调色板颜色 × 不透明 的结果。
2)不同的图层不透明算法的比较
3)重着色编辑结果,需要注意的是,重着色结果保持图层不透明度不变,只是改变调色板颜色进行重新alpha-blending即可。