查看“︁Alpha合成”︁的源代码
←
Alpha合成
跳转到导航
跳转到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[Image:Hue alpha falloff.png|thumb|这张图片的[[Alpha通道]]中的值越往下越趋近于零。]] 在[[计算机图形学]]领域中,'''Alpha合成'''({{lang-en|alpha compositing}}),又称'''Alpha混合'''({{lang-en|alpha blending}}),是一种将图像与背景结合的过程,结合后可以产生部分透明或全透明的视觉效果。Alpha合成也叫'''阿尔法合成'''或'''透明合成'''。渲染图像时,通常会将目标图像中的多个子元素单独渲染,最后再把多张子元素的图片{{Tsl|en|Compositing|合成 (特效)|合成}}为单独的图像。例如,电视直播时就会将大量计算机生成的图像元素合成到现场镜头上。 要正确结合图像元素,每个元素的必须有对应的{{Tsl|en|Matte (filmmaking)|遮片}}。遮片包含覆盖范围信息——图中几何对象的形状——可以藉此分辨图像中的任意位置到底是被绘制的几何对象本身,还是逻辑上的「空白」区域。 == 描述 == 为了保存遮片信息,[[匠白光]]提出了[[Alpha通道]]的概念,后由{{Tsl|en|Thomas K. Porter|Thomas Porter|托马斯·波特}}和{{Tsl|en|Tom Duff|汤姆·达夫}}完善。<ref>{{cite journal|last=Porter|first=Thomas|author2=Tom Duff|year=1984|title=Compositing Digital Images|journal=Computer Graphics|volume=18|issue=3|pages=253–259|doi=10.1145/800031.808606|isbn=0-89791-138-5}}<br>(见 [http://graphics.pixar.com/library/Compositing/ pixar.com.] {{Wayback|url=http://graphics.pixar.com/library/Compositing/ |date=20110415005102 }})</ref>二维图像里记录着每个[[像素]]的颜色信息,额外的信息以 0 和 1 之间的值表示,记录在Alpha通道里。0 表示该像素没有覆盖信息,是透明的,即图中的几何体没有覆盖到本像素;而 1 则表示像素不透明,几何体完全覆盖了此像素。 图像中使用的Alpha通道通常有两种表示形式:'''平直Alpha'''({{lang-en|straight alpha}})和'''预乘Alpha'''({{lang-en|premultiplied alpha}})。 * 如果使用平直Alpha,图像中的RGB分量仅表示像素的颜色,与是否透明无关。 * 如果使用预乘Alpha,图像中的RGB分量也表示像素的颜色,但事先已经和不透明度做了乘法。某些使用场景下,这样的做法可以在后续合成时节省一次乘法。不过预乘Alpha的最显著优势在于使用简单、准确而非性能。<ref>{{cite web|url=https://tomforsyth1000.github.io/blog.wiki.html#%5B%5BPremultiplied+alpha%5D%5D|title=TomF's Tech Blog - It's only pretending to be a wiki.|author=|date=|website=tomforsyth1000.github.io|accessdate=8 May 2018|deadurl=yes|archiveurl=https://web.archive.org/web/20171212111056/http://tomforsyth1000.github.io/blog.wiki.html#%5B%5BPremultiplied+alpha%5D%5D|archivedate=2017-12-12|df=}}</ref> 如果用平直的(非预乘)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通道,图片的合成操作就可以用{{Tsl|en|Composition algebra|合成代数}}的形式表达。假设有图像元素 A 和 B,最常见的合成操作就是把 A 作为前景、B 作为背景,我们称这种操作(运算)为 '''over''',记作 <math>A \operatorname{over} B</math>。除此之外,波特和达夫还定义了其它几个运算符:'''in'''、'''out'''、'''atop'''、'''xor''': [[Image:Alpha compositing.svg]] 运算符 '''over''' 的效果与普通绘画效果一致(见[[画家算法]]),运算符 '''in''' 则等价于{{Tsl|en|Clipping (computer graphics)|裁剪}}。 以运算符 '''over''' 为例,运算结果相当于对图像中的所有像素做以下公式: :<math>\alpha_o = \alpha_a + \alpha_b \left(1 - \alpha_a\right)</math> :<math>C_o = \frac{C_a \alpha_a + C_b \alpha_b \left(1 - \alpha_a\right)}{\alpha_o}</math> 其中 <math>C_o</math> 是运算结果,<math>C_a</math> 是图像 A 中的像素,<math>C_b</math> 是图像 B 中的像素,而 <math>\alpha_a</math> 和 <math>\alpha_b</math> 则分别是图像 A、B 中对应像素的Alpha值。 如果假设颜色值都是预乘了Alpha值的(<math>c_i = \alpha_i C_i</math>),那么我们就可以将等式进行改写,结果图像中的颜色即: :<math>c_o = c_a + c_b \left(1 - \alpha_a\right)</math> 结果中的Alpha值即: :<math>\alpha_o = \frac{c_o}{C_o} = \alpha_a + \alpha_b \left(1 - \alpha_a\right)</math> == over 运算符的解析推导 == 通过研究[[正交覆盖]],Porter 和 Buff 给出了 alpha 合成的几何解释。在 1981 年 [[Bruce A. Wallace]] 的论文里则给出了另一种基于的[[反射率]]/[[透过率]]的物理模型的另一种推导。<ref>{{cite journal |last=Wallace |first=Bruce A. |author-link=Bruce A. Wallace |date=1981 |title=Merging and transformation of raster images for cartoon animation |journal=SIGGRAPH Computer Graphics |location=New York City, New York |publisher=ACM Press |volume=15 |issue=3 |pages=253–262 |doi=10.1145/800224.806813 |isbn=0-89791-045-1|via=}}</ref> 第三种推导方法通过使用两条简单的假设得到。为了简单起见,我们将 '''over''' 运算符简记成 <math>a \odot b</math>。 第一条假设是当背景是不透明(即 <math>\alpha_b = 1</math>)时,'''over''' 运算符表示前景颜色与背景颜色的[[凸组合]]: :<math>C_o = \alpha_a C_a + (1 - \alpha_a) C_b</math> 第二条假设是这种运算应该满足[[结合律]]: :<math>(a \odot b) \odot c = a \odot (b \odot c)</math> 现在,可以假设 <math>a</math> 和 <math>b</math> 包含不透明度分量,而 <math>c</math> 不包含。考虑中间变量 :<math>o = a \odot b</math>. 由于结合律成立,有 :<math>o \odot c = a \odot (b \odot c)</math> 由于 <math>c</math> 是不透明的,因此 <math>b \odot c</math> 也是不透明的。由第二条假设,在上面的式子中,上式地每个 <math>\odot</math> 运算都可以用凸组合表达: :<math> \begin{align} \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{align} </math> 这个式子的两边都满足 <math>X_0 + Y_0 C_c = X_1 + Y_1 C_c</math> 的形式,令 <math>X_0 = X_1</math> 且 <math>Y_0 = Y_1</math>,可以得到: :<math> \begin{align} \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{align} </math> 至此,我们推导出了 <math>o = a \odot b</math> 的颜色和其 alpha 分量的解析式。 注意到 <math>(1 - \alpha_a)\alpha_b = \alpha_o - \alpha_a</math>,这样,上式可以紧凑地表示成 :<math> C_o = \frac{\alpha_a}{\alpha_o} C_a + \left(1 - \frac{\alpha_a}{\alpha_o}\right) C_b </math> <math>\odot</math> 运算符满足[[非交换]][[幺半群]]的定义。这个群的[[单位元]] <math>e</math> 是所有满足 <math>\alpha = 0</math> 的二元组 <math>\langle C,\alpha\rangle</math>,这可以通过式子 <math>e \odot a = a \odot e = a</math> 得到。 == Alpha混合 == '''Alpha混合'''({{lang-en|alpha blending}})是将半透明的前景色与背景色结合的过程,可以得到混合后的新颜色。前景色的透明度不限,从完全透明到完全不透明都可以。如果前景色完全透明,混合后的颜色就是背景色;如果前景色完全不透明,混合后的颜色就是前景色;如果在这两种极端情况之间,混合后的颜色可以通过前景色和背景色的[[加权]]平均计算。 Alpha合成后的颜色可以这样计算: :<math> \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} </math> 如果背景色不透明,即 <math>dst_A = 1</math>,代入上述方程后可以得到: :<math> \begin{cases} \mathrm{out}_A = 1 \\ \mathrm{out}_{RGB} = \mathrm{src}_{RGB} \mathrm{src}_A + \mathrm{dst}_{RGB} (1 - \mathrm{src}_A) \end{cases} </math> 如果使用了预乘Alpha,最初的方程组可以简化为: :<math> \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} </math> == 伽玛校正 == [[File:Mix lazy.png|thumb|不考虑伽玛校正,直接做 Alpha 混合的效果。]] [[File:Mix precise.png|thumb|考虑伽玛校正,做 Alpha 混合的效果。]] 计算机图像一般不直接存储光照[[亮度]]对应的 RGB 值,而是需要先对这些值做[[伽玛校正]]。 伽玛校正的大致过程如下: * 设 <math>displayed_{RGB}</math> 为屏幕上显示的 RGB 亮度(标准化后的亮度值,在 0 和 1 之间) * 设 <math>stored_{RGB}</math> 为计算机[[内存]]中所存储的 RGB 亮度(也是标准化后的亮度值) * 设 <math>\gamma</math> 为用于「解码」<math>stored_{RGB}</math> 图像的伽玛值 2.2(2.2 为 <math>\gamma</math> 的典型取值) 则它们三者之间的关系为 :<math>displayed_{RGB} = {stored_{RGB}} ^ {\gamma}</math> 因此,在处理计算机图像的 RGB 值时(尤其是做 Alpha 混合时),可以在处理前先将伽玛校正消除,完成处理后再重新做伽玛校正,这样做的效果比直接处理伽玛校正后的 RGB 值要好。 例如有一张图片 <math>overlay_{rgb}</math>,它对应的 Alpha 通道为 <math>overlay_{\alpha}</math>,现在要把它叠加到背景图 <math>background_{rgb}</math> 上,那么最终的图像 <math>out_{rgb}</math> 可以这样计算: :<math> out_{rgb} = ({overlay_{rgb}}^{\gamma } \times overlay_{\alpha} + {background_{rgb}}^{\gamma } \times (1 - overlay_{\alpha})) ^{1/\gamma } </math> 此处的 <math>out_{rgb}</math> 是计算机内存中所存储的数据;在计算机显示器上会以 <math>out_{rgb} ^ {\gamma}</math> 的数据显示。 == 参考资料 == <references /> {{计算机图形学}} [[Category: 计算机图形学]]
该页面使用的模板:
Template:Cite journal
(
查看源代码
)
Template:Cite web
(
查看源代码
)
Template:Lang-en
(
查看源代码
)
Template:Tsl
(
查看源代码
)
Template:Wayback
(
查看源代码
)
Template:计算机图形学
(
查看源代码
)
返回
Alpha合成
。
导航菜单
个人工具
登录
命名空间
页面
讨论
不转换
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
特殊页面
工具
链入页面
相关更改
页面信息