• 经典论文回顾:Decomposing Images into Layers via RGB-space Geometry


    论文:Decomposing Images into Layers via RGB-space Geometry 发表于ACM TOG 2016,是第一个基于RGB凸包的调色板图像编辑算法,我近两年的研究跟本文有很大关系,因此这里再次回顾一下这篇经典论文。

    本文目标是对于给定图像提取出调色板,计算对应的半透明图层,并期望通过这些图层完美重建出输入图像,下图展示了该方法的输入和输出。
    在这里插入图片描述
    算法分为两步:1)计算初始调色板和简化;2)计算调色板对应的半透明图层. 下面做详细分析.

    一、计算初始调色板

    初始调色板的求解过程如下图所示,分为三个步骤:

    • (1)将图像投影到RGB空间,颜色为(r,g,b)的像素对应RGB空间下的3D点p(r,g,b). 因此,整个图像对应RGB空间下的一个点集;
    • (2)求解该点集的初始凸包,但初始凸包拓扑复杂,顶点较多,需要进一步简化。
    • (3)最后,将简化凸包作为图像的调色板。
      在这里插入图片描述
    简化初始凸包

    那么,如何简化上图第3列所示的初始凸包呢?本文通过缩边的方式对原始凸包进行简化,迭代的将边缩减为点,每次缩边操作使得体积增加。如下图所示,主要分为三步:

    • 1)计算每条边收缩为点后凸包体积的增量;
    • 2)选择增量最小的边进行收缩, 每次缩边使得顶点数目减一;
    • 3)重复上述过程,直到凸包顶点数目缩减到给定值.
    • 4)将简化凸包的顶点作为图像调色板.
      在这里插入图片描述

    那么,对于某一条候选边,如何计算缩边带来的体积增量呢?

    对于每条候选边 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/3n(vvi)(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=argmin3An(vvx)  s.t. 3An(vvx)>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)基于能量优化的算法。接下来,对这两种算法简单介绍.

    2.1 基于广义重心坐标的算法求解不透明度

    我们注意到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+Ipn1(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=1nwiCi(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\{

    1j=1i1wjj=1iwj    ,j=1iwj>00    ,𝑜𝑡𝑒𝑟𝑤𝑖𝑠𝑒" role="presentation" style="position: relative;">1j=1i1wjj=1iwj    ,j=1iwj>00    ,𝑜𝑡𝑒𝑟𝑤𝑖𝑠𝑒
    \right.\tag5 αpi= 1j=1iwjj=1i1wj    ,j=1iwj>00    ,otherwise(5)
    本文采用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.2 基于能量优化的算法求解不透明度

    本质上,公式(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∣∣IpnIp2(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=1n(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=1n(αi)2(9)
    然后,直接求解即可得到多个图层,per-pixel的不透明度。

    三、实验效果

    1)图层分解示例:这里的图层是 调色板颜色 × 不透明 的结果。
    在这里插入图片描述
    2)不同的图层不透明算法的比较
    在这里插入图片描述

    3)重着色编辑结果,需要注意的是,重着色结果保持图层不透明度不变,只是改变调色板颜色进行重新alpha-blending即可。

    在这里插入图片描述

  • 相关阅读:
    HBuilderx快捷键
    nginx的重写和重定向-你俩究竟是什么关系???
    信息检索与数据挖掘 | 【实验】排名检索模型
    java计算机毕业设计springboot+vue游戏道具管理系统
    MySQL数据库管理
    oracle 19c 统计信息详解
    关于利用rundll32执行程序的分析
    axios发送常见请求方式以及拦截器的封装
    Ambire & KuCoin 发起 ADX 交易竞赛,提供价值 50,000 美元的奖池
    图扑 3D 可视化国风设计 | 科技与文化碰撞炫酷”火花“
  • 原文地址:https://blog.csdn.net/u011426016/article/details/127458207