这张图片的Alpha通道 中的值越往下越趋近于零。
在计算机图形学 领域中,Alpha合成 (英語:alpha compositing ),又称Alpha混合 (英語:alpha blending ),是一种将图像与背景结合的过程,结合后可以产生部分透明或全透明的视觉效果。Alpha合成也叫阿尔法合成 或透明合成 。渲染图像时,通常会将目标图像中的多个子元素单独渲染,最后再把多张子元素的图片合成 为单独的图像。例如,电视直播时就会将大量计算机生成的图像元素合成到现场镜头上。
要正确结合图像元素,每个元素的必须有对应的遮片 。遮片包含覆盖范围信息——图中几何对象的形状——可以藉此分辨图像中的任意位置到底是被绘制的几何对象本身,还是逻辑上的「空白」区域。
描述
为了保存遮片信息,匠白光 提出了Alpha通道 的概念,后由托马斯·波特 和汤姆·达夫 完善。[ 1] 二维图像里记录着每个像素 的颜色信息,额外的信息以 0 和 1 之间的值表示,记录在Alpha通道里。0 表示该像素没有覆盖信息,是透明的,即图中的几何体没有覆盖到本像素;而 1 则表示像素不透明,几何体完全覆盖了此像素。
图像中使用的Alpha通道通常有两种表示形式:平直Alpha (英語:straight alpha )和预乘Alpha (英語:premultiplied alpha )。
如果使用平直Alpha,图像中的RGB分量仅表示像素的颜色,与是否透明无关。
如果使用预乘Alpha,图像中的RGB分量也表示像素的颜色,但事先已经和不透明度做了乘法。某些使用场景下,这样的做法可以在后续合成时节省一次乘法。不过预乘Alpha的最显著优势在于使用简单、准确而非性能。[ 2]
如果用平直的(非预乘)RGBA 元组 表达像素颜色,那么像素值 (0, 0.7, 0, 0.5) 表示像素有 70% 的最大绿色亮度,同时不透明度是 50%。同样条件下的纯绿色是 (0, 1, 0, 0.5)。而如果用预乘Alpha,此处的 RGB 值 (0, 0.7, 0) 需要都乘以 0.5,表达为 (0, 0.35, 0, 0.5)。虽然此处 G 通道的值是 0.35 ,但它表示的还是最大亮度的 70%(其中包含了 50% 的不透明度)。此时的纯绿色则需要表达为 (0, 0.5, 0, 0.5)。因此,了解图像(文件)到底使用的是平直Alpha还是预乘Alpha非常重要,只有这样才能对图像做正确的处理和合成。
有了Alpha通道,图片的合成操作就可以用合成代数 的形式表达。假设有图像元素 A 和 B,最常见的合成操作就是把 A 作为前景、B 作为背景,我们称这种操作(运算)为 over ,记作
A
over
B
{\displaystyle A\operatorname {over} B}
。除此之外,波特和达夫还定义了其它几个运算符:in 、out 、atop 、xor :
运算符 over 的效果与普通绘画效果一致(见画家算法 ),运算符 in 则等价于裁剪 。
以运算符 over 为例,运算结果相当于对图像中的所有像素做以下公式:
α
o
=
α
a
+
α
b
(
1
−
α
a
)
{\displaystyle \alpha _{o}=\alpha _{a}+\alpha _{b}\left(1-\alpha _{a}\right)}
C
o
=
C
a
α
a
+
C
b
α
b
(
1
−
α
a
)
α
o
{\displaystyle C_{o}={\frac {C_{a}\alpha _{a}+C_{b}\alpha _{b}\left(1-\alpha _{a}\right)}{\alpha _{o}}}}
其中
C
o
{\displaystyle C_{o}}
是运算结果,
C
a
{\displaystyle C_{a}}
是图像 A 中的像素,
C
b
{\displaystyle C_{b}}
是图像 B 中的像素,而
α
a
{\displaystyle \alpha _{a}}
和
α
b
{\displaystyle \alpha _{b}}
则分别是图像 A、B 中对应像素的Alpha值。
如果假设颜色值都是预乘了Alpha值的(
c
i
=
α
i
C
i
{\displaystyle c_{i}=\alpha _{i}C_{i}}
),那么我们就可以将等式进行改写,结果图像中的颜色即:
c
o
=
c
a
+
c
b
(
1
−
α
a
)
{\displaystyle c_{o}=c_{a}+c_{b}\left(1-\alpha _{a}\right)}
结果中的Alpha值即:
α
o
=
c
o
C
o
=
α
a
+
α
b
(
1
−
α
a
)
{\displaystyle \alpha _{o}={\frac {c_{o}}{C_{o}}}=\alpha _{a}+\alpha _{b}\left(1-\alpha _{a}\right)}
over 运算符的解析推导
通过研究正交覆盖 ,Porter 和 Buff 给出了 alpha 合成的几何解释。在 1981 年 Bruce A. Wallace 的论文里则给出了另一种基于的反射率 /透过率 的物理模型的另一种推导。[ 3]
第三种推导方法通过使用两条简单的假设得到。为了简单起见,我们将 over 运算符简记成
a
⊙
b
{\displaystyle a\odot b}
。
第一条假设是当背景是不透明(即
α
b
=
1
{\displaystyle \alpha _{b}=1}
)时,over 运算符表示前景颜色与背景颜色的凸组合 :
C
o
=
α
a
C
a
+
(
1
−
α
a
)
C
b
{\displaystyle C_{o}=\alpha _{a}C_{a}+(1-\alpha _{a})C_{b}}
第二条假设是这种运算应该满足结合律 :
(
a
⊙
b
)
⊙
c
=
a
⊙
(
b
⊙
c
)
{\displaystyle (a\odot b)\odot c=a\odot (b\odot c)}
现在,可以假设
a
{\displaystyle a}
和
b
{\displaystyle b}
包含不透明度分量,而
c
{\displaystyle c}
不包含。考虑中间变量
o
=
a
⊙
b
{\displaystyle o=a\odot b}
.
由于结合律成立,有
o
⊙
c
=
a
⊙
(
b
⊙
c
)
{\displaystyle o\odot c=a\odot (b\odot c)}
由于
c
{\displaystyle c}
是不透明的,因此
b
⊙
c
{\displaystyle b\odot c}
也是不透明的。由第二条假设,在上面的式子中,上式地每个
⊙
{\displaystyle \odot }
运算都可以用凸组合表达:
α
o
C
o
+
(
1
−
α
o
)
C
c
=
α
a
C
a
+
(
1
−
α
a
)
(
α
b
C
b
+
(
1
−
α
b
)
C
c
)
=
[
α
a
C
a
+
(
1
−
α
a
)
α
b
C
b
]
+
(
1
−
α
a
)
(
1
−
α
b
)
C
c
{\displaystyle {\begin{aligned}\alpha _{o}C_{o}+(1-\alpha _{o})C_{c}&=\alpha _{a}C_{a}+(1-\alpha _{a})(\alpha _{b}C_{b}+(1-\alpha _{b})C_{c})\\&=[\alpha _{a}C_{a}+(1-\alpha _{a})\alpha _{b}C_{b}]+(1-\alpha _{a})(1-\alpha _{b})C_{c}\end{aligned}}}
这个式子的两边都满足
X
0
+
Y
0
C
c
=
X
1
+
Y
1
C
c
{\displaystyle X_{0}+Y_{0}C_{c}=X_{1}+Y_{1}C_{c}}
的形式,令
X
0
=
X
1
{\displaystyle X_{0}=X_{1}}
且
Y
0
=
Y
1
{\displaystyle Y_{0}=Y_{1}}
,可以得到:
α
o
=
1
−
(
1
−
α
a
)
(
1
−
α
b
)
,
C
o
=
α
a
C
a
+
(
1
−
α
a
)
α
b
C
b
α
o
,
{\displaystyle {\begin{aligned}\alpha _{o}&=1-(1-\alpha _{a})(1-\alpha _{b}),\\C_{o}&={\frac {\alpha _{a}C_{a}+(1-\alpha _{a})\alpha _{b}C_{b}}{\alpha _{o}}},\end{aligned}}}
至此,我们推导出了
o
=
a
⊙
b
{\displaystyle o=a\odot b}
的颜色和其 alpha 分量的解析式。
注意到
(
1
−
α
a
)
α
b
=
α
o
−
α
a
{\displaystyle (1-\alpha _{a})\alpha _{b}=\alpha _{o}-\alpha _{a}}
,这样,上式可以紧凑地表示成
C
o
=
α
a
α
o
C
a
+
(
1
−
α
a
α
o
)
C
b
{\displaystyle C_{o}={\frac {\alpha _{a}}{\alpha _{o}}}C_{a}+\left(1-{\frac {\alpha _{a}}{\alpha _{o}}}\right)C_{b}}
⊙
{\displaystyle \odot }
运算符满足非交换 幺半群 的定义。这个群的单位元
e
{\displaystyle e}
是所有满足
α
=
0
{\displaystyle \alpha =0}
的二元组
⟨
C
,
α
⟩
{\displaystyle \langle C,\alpha \rangle }
,这可以通过式子
e
⊙
a
=
a
⊙
e
=
a
{\displaystyle e\odot a=a\odot e=a}
得到。
Alpha混合
Alpha混合 (英語:alpha blending )是将半透明的前景色与背景色结合的过程,可以得到混合后的新颜色。前景色的透明度不限,从完全透明到完全不透明都可以。如果前景色完全透明,混合后的颜色就是背景色;如果前景色完全不透明,混合后的颜色就是前景色;如果在这两种极端情况之间,混合后的颜色可以通过前景色和背景色的加权 平均计算。
Alpha合成后的颜色可以这样计算:
{
o
u
t
A
=
s
r
c
A
+
d
s
t
A
(
1
−
s
r
c
A
)
o
u
t
R
G
B
=
(
s
r
c
R
G
B
s
r
c
A
+
d
s
t
R
G
B
d
s
t
A
(
1
−
s
r
c
A
)
)
÷
o
u
t
A
o
u
t
A
=
0
⇒
o
u
t
R
G
B
=
0
{\displaystyle {\begin{cases}\mathrm {out} _{A}=\mathrm {src} _{A}+\mathrm {dst} _{A}(1-\mathrm {src} _{A})\\\mathrm {out} _{RGB}={\bigl (}\mathrm {src} _{RGB}\mathrm {src} _{A}+\mathrm {dst} _{RGB}\mathrm {dst} _{A}\left(1-\mathrm {src} _{A}\right){\bigr )}\div \mathrm {out} _{A}\\\mathrm {out} _{A}=0\Rightarrow \mathrm {out} _{RGB}=0\end{cases}}}
如果背景色不透明,即
d
s
t
A
=
1
{\displaystyle dst_{A}=1}
,代入上述方程后可以得到:
{
o
u
t
A
=
1
o
u
t
R
G
B
=
s
r
c
R
G
B
s
r
c
A
+
d
s
t
R
G
B
(
1
−
s
r
c
A
)
{\displaystyle {\begin{cases}\mathrm {out} _{A}=1\\\mathrm {out} _{RGB}=\mathrm {src} _{RGB}\mathrm {src} _{A}+\mathrm {dst} _{RGB}(1-\mathrm {src} _{A})\end{cases}}}
如果使用了预乘Alpha,最初的方程组可以简化为:
{
o
u
t
A
=
s
r
c
A
+
d
s
t
A
(
1
−
s
r
c
A
)
o
u
t
R
G
B
=
s
r
c
R
G
B
+
d
s
t
R
G
B
(
1
−
s
r
c
A
)
{\displaystyle {\begin{cases}\mathrm {out} _{A}=\mathrm {src} _{A}+\mathrm {dst} _{A}(1-\mathrm {src} _{A})\\\mathrm {out} _{RGB}=\mathrm {src} _{RGB}+\mathrm {dst} _{RGB}\left(1-\mathrm {src} _{A}\right)\end{cases}}}
伽玛校正
不考虑伽玛校正,直接做 Alpha 混合的效果。
考虑伽玛校正,做 Alpha 混合的效果。
计算机图像一般不直接存储光照亮度 对应的 RGB 值,而是需要先对这些值做伽玛校正 。
伽玛校正的大致过程如下:
设
d
i
s
p
l
a
y
e
d
R
G
B
{\displaystyle displayed_{RGB}}
为屏幕上显示的 RGB 亮度(标准化后的亮度值,在 0 和 1 之间)
设
s
t
o
r
e
d
R
G
B
{\displaystyle stored_{RGB}}
为计算机内存 中所存储的 RGB 亮度(也是标准化后的亮度值)
设
γ
{\displaystyle \gamma }
为用于「解码」
s
t
o
r
e
d
R
G
B
{\displaystyle stored_{RGB}}
图像的伽玛值 2.2(2.2 为
γ
{\displaystyle \gamma }
的典型取值)
则它们三者之间的关系为
d
i
s
p
l
a
y
e
d
R
G
B
=
s
t
o
r
e
d
R
G
B
γ
{\displaystyle displayed_{RGB}={stored_{RGB}}^{\gamma }}
因此,在处理计算机图像的 RGB 值时(尤其是做 Alpha 混合时),可以在处理前先将伽玛校正消除,完成处理后再重新做伽玛校正,这样做的效果比直接处理伽玛校正后的 RGB 值要好。
例如有一张图片
o
v
e
r
l
a
y
r
g
b
{\displaystyle overlay_{rgb}}
,它对应的 Alpha 通道为
o
v
e
r
l
a
y
α
{\displaystyle overlay_{\alpha }}
,现在要把它叠加到背景图
b
a
c
k
g
r
o
u
n
d
r
g
b
{\displaystyle background_{rgb}}
上,那么最终的图像
o
u
t
r
g
b
{\displaystyle out_{rgb}}
可以这样计算:
o
u
t
r
g
b
=
(
o
v
e
r
l
a
y
r
g
b
γ
×
o
v
e
r
l
a
y
α
+
b
a
c
k
g
r
o
u
n
d
r
g
b
γ
×
(
1
−
o
v
e
r
l
a
y
α
)
)
1
/
γ
{\displaystyle out_{rgb}=({overlay_{rgb}}^{\gamma }\times overlay_{\alpha }+{background_{rgb}}^{\gamma }\times (1-overlay_{\alpha }))^{1/\gamma }}
此处的
o
u
t
r
g
b
{\displaystyle out_{rgb}}
是计算机内存中所存储的数据;在计算机显示器上会以
o
u
t
r
g
b
γ
{\displaystyle out_{rgb}^{\gamma }}
的数据显示。
参考资料
^ Porter, Thomas; Tom Duff. Compositing Digital Images. Computer Graphics. 1984, 18 (3): 253–259. ISBN 0-89791-138-5 . doi:10.1145/800031.808606 . (见 pixar.com. (页面存档备份 ,存于互联网档案馆 ))
^ TomF's Tech Blog - It's only pretending to be a wiki. . tomforsyth1000.github.io. [8 May 2018] . (原始内容 存档于2017-12-12).
^ Wallace, Bruce A. Merging and transformation of raster images for cartoon animation. SIGGRAPH Computer Graphics (New York City, New York: ACM Press). 1981, 15 (3): 253–262. ISBN 0-89791-045-1 . doi:10.1145/800224.806813 .