Alpha合成
佇計算機圖形學領域,Alpha 合成(英語:alpha compositing)是一種共圖像佮背景結合的過程,結合了後會當產生部份透明抑是全透明的視覺效果。Alpha 合成嘛叫阿爾法合成抑是透明來合成。渲染圖像的時陣,通常會共目標圖像中的幾个子元素單獨渲染,最後閣共加張子元素的圖片變成做單獨的圖像。比如講,電視直播的時陣就會將大量計算機生的圖像元素合成到現場的鏡頭頂懸。
愛正確來結合圖像元素,每一个元素的著愛有對應的遮片。這片包括崁的範圍信息—— 圖內底幾何對象的形狀—— 會當藉此分辨圖像中的任意位置到底是被繪製的幾何對象本身,抑是邏輯上的「空白」區域。
是咧講
為著欲保存遮片信息,師白光提出來 Alpha 迵去的概念,後由托馬斯 ・ 波特佮湯姆 ・ 達夫完善。二維圖像里記錄著逐个像素的色水有信息,另外的信息以零佮一之間的值表示,記錄佇 Alpha 通道里。零表示該像素無崁信息,是若透明的,即圖當中的幾何體無崁著本像素;若一則表示像素不透明,幾何體完全崁去矣這像素。
圖像使用的 Alpha 通道通常有兩種表示形式:平直 Alpha(英語:straight alpha)和預乘 Alpha(英語:premultiplied alpha)。
- 若使用平直 Alpha,圖像中的 RGB 分量干焦表示像素的色水,佮敢是透明無關係。
- 若使用預乘 Alpha,圖像中的 RGB 分量嘛表示像素的色水,但是事先已經和無透明度做矣乘法。某寡使用的場景下,按呢的做法會用佇咧後續合成時節省一擺乘法。不過預乘 Alpha 的上衝碰優勢咧使用簡單、確定而非性能。
若用平直的(非預乘)RGBA 元組表達像素色,按呢像素值 ( 零 , 空九七 , 零 , 空七五 ) 表示像素有百分之七十的上大的青色光度,同時無透明度是百分之五十。仝款條件下跤的純綠色是 ( 零 , 一 , 零 , 空七五 )。若用預乘 Alpha,此處的 RGB 值 ( 零 , 空九七 , 零 ) 攏需要攏乘以零瀨五,表達為 ( 零 , 空九三五 , 零 , 空七五 )。雖然這搭遮 G 通道的值是零交三五,但伊表示的猶是上大的光度的百分之七十(其中包括百分之五十的無透明度)。 現此時的純綠色需要表達為 ( 零 , 空七五 , 零 , 空七五 )。所以,了解圖像(文件)到底是使用的平直 Alpha 抑是預乘 Alpha 非常的重要,干焦按呢才會當對圖像做正確的處理佮合成。
有矣 Alpha 巷路,圖片的合成操作就會當用合成代數的形式表達。假使有圖像元素 A 和 B,上捷看著的合成操作就是共 A 做前景、B 做背景,咱講這款的操作(運算)為over,記作 $ A \ operatorname { over } B $。除了這以外,波特佮達夫閣定義其他幾个運算符:in、out、atop、xor:
運算符over的效果佮普通繪畫效果一致(見畫家算法), 運算符in等於裁剪。
以運算符over做例,運算結果比較對圖像中的所有的像素做以下的公式按呢:
- $ \ alpha _ { o }=\ alpha _ { a } + \ alpha _ { b } \ left ( 一-\ alpha _ { a } \ right ) $
- $ C _ { o }={ \ frac { C _ { a } \ alpha _ { a } + C _ { b } \ alpha _ { b } \ left ( 一-\ alpha _ { a } \ right ) } { \ alpha _ { o } } } $
其中 $ C _ { o } $ 是運算結果,$ C _ { a } $ 是圖像 A 中的像素啦,$ C _ { b } $ 是圖像 B 中的像素啦,而且 $ \ alpha _ { a } $ 和 $ \ alpha _ { b } $ 是分別是圖像 A、B 中對應像素的 Alpha 值。
若準講設色水的值攏預乘矣 Alpha 值的($ c _ { i }=\ alpha _ { i } C _ { i } $), 按呢咱就會當共等式進行改寫,結果圖像著的色緻就著矣:
- $ c _ { o }=c _ { a } + c _ { b } \ left ( 一-\ alpha _ { a } \ right ) $
結果著的 Alpha 值即:
- $ \ alpha _ { o }={ \ frac { c _ { o } } { C _ { o } } }=\ alpha _ { a } + \ alpha _ { b } \ left ( 一-\ alpha _ { a } \ right ) $
over 運算符合的推導
通過研究當咧交陪,Porter 和 Buff 給出了 alpha 合成的幾何解說。佇一九八一年 Bruce A . Wallace 的論文內底總共出另外一種基於的反射率 / 透過率的物理模型的另外一種推導。
第三種推導方法通過使用兩條簡單的假使得著。為著簡單起見,阮共over運算符簡記成 $ a \ odot b $。
第一條假使是做背景是無透明(即 $ \ alpha _ { b }=一 $)時,over運算符表示前景色水佮背景色水的噗組合:
- $ C _ { o }=\ alpha _ { a } C _ { a } + ( 一-\ alpha _ { a } ) C _ { b } $
第二條假使是這種運算應該滿足結合律:
- $ ( a \ odot b ) \ odot c=a \ odot ( b \ odot c ) $
這馬乎,會使假使講 $ a $ 和 $ b $ 包含無透明度的分量,而且 $ c $ 無包括。考慮中央變量
- $ o=a \ odot b $ .
因為結合律成立,有
- $ o \ odot c=a \ odot ( b \ odot c ) $
因為 $ c $ 是無透明的,所以 $ b \ odot c $ 嘛是無透明的。由第二條假使,佇頂懸的式內底,上式地每一个 $ \ odot $ 運算攏會當用噗組合表達:
- $ { \ begin { aligned } \ alpha _ { o } C _ { o } + ( 一-\ alpha _ { o } ) C _ { c } &=\ alpha _ { a } C _ { a } + ( 一-\ alpha _ { a } ) ( \ alpha _ { b } C _ { b } + ( 一-\ alpha _ { b } ) C _ { c } ) \ \ &=[\ alpha _ { a } C _ { a } + ( 一-\ alpha _ { a } ) \ alpha _ { b } C _ { b }] + ( 一-\ alpha _ { a } ) ( 一-\ alpha _ { b } ) C _ { c } \ end { aligned } } $
這式的兩爿攏滿足 $ X _ { 零 } + Y _ { 零 } C _ { c }=X _ { 一 } + Y _ { 一 } C _ { c } $ 彼个形體,令 $ X _ { 零 }=X _ { 一 } $ 而且 $ Y _ { 零 }=Y _ { 一 } $,會用得著:
- $ { \ begin { aligned } \ alpha _ { o } &=一-( 一-\ alpha _ { a } ) ( 一-\ alpha _ { b } ) , \ \ C _ { o } &={ \ frac { \ alpha _ { a } C _ { a } + ( 一-\ alpha _ { a } ) \ alpha _ { b } C _ { b } } { \ alpha _ { o } } } , \ end { aligned } } $
到此,咱推導出著 $ o=a \ odot b $ 的色水佮其實 alpha 分量的分析式。
注意著 $ ( 一-\ alpha _ { a } ) \ alpha _ { b }=\ alpha _ { o }-\ alpha _ { a } $,按呢乎,頂式會當趕緊鬥地表示成做
- $ C _ { o }={ \ frac { \ alpha _ { a } } { \ alpha _ { o } } } C _ { a } + \ left ( 一-{ \ frac { \ alpha _ { a } } { \ alpha _ { o } } } \ right ) C _ { b } $
$ \ odot $ 運算符滿足非交換屘囝半群的定義。這个群的單位元 $ e $ 是所有的滿足 $ \ alpha=零 $ 的二元組 $ \ langle C , \ alpha \ rangle $,這會當通過式子 $ e \ odot a=a \ odot e=a $ 得著。
Alpha 透濫
Alpha 透濫(英語:alpha blending)是將半透明的前景色佮背景色敆做伙的過程,會當得著混合了後的新色水。前景色的透明度無限,對完全透明到完全無透明攏會使。若是前景色攏完全透明,透濫的色水就是背景色;若是前景色攏完全無透明,透濫的色水就是頭前景色;若佇這兩種極端的情況之間,透濫了後的色水會當通過前景色佮背景色的加權平均計算。
Alpha 合成了的色水會當按呢算了:
- $ { \ begin { cases } \ mathrm { out } _ { A }=\ mathrm { src } _ { A } + \ mathrm { dst } _ { A } ( 一-\ mathrm { src } _ { A } ) \ \ \ mathrm { out } _ { RGB }={ \ bigl ( } \ mathrm { src } _ { RGB } \ mathrm { src } _ { A } + \ mathrm { dst } _ { RGB } \ mathrm { dst } _ { A } \ left ( 一-\ mathrm { src } _ { A } \ right ) { \ bigr ) } \ div \ mathrm { out } _ { A } \ \ \ mathrm { out } _ { A }=零 \ Rightarrow \ mathrm { out } _ { RGB }=零 \ end { cases } } $
若是背景色無透明,即 $ dst _ { A }=一 $,來講頂懸的故事了後會當得著:
- $ { \ begin { cases } \ mathrm { out } _ { A }=一 \ \ \ mathrm { out } _ { RGB }=\ mathrm { src } _ { RGB } \ mathrm { src } _ { A } + \ mathrm { dst } _ { RGB } ( 一-\ mathrm { src } _ { A } ) \ end { cases } } $
若使用著預乘 Alpha,上頭仔這个方程組會當較簡省為:
- $ { \ begin { cases } \ mathrm { out } _ { A }=\ mathrm { src } _ { A } + \ mathrm { dst } _ { A } ( 一-\ mathrm { src } _ { A } ) \ \ \ mathrm { out } _ { RGB }=\ mathrm { src } _ { RGB } + \ mathrm { dst } _ { RGB } \ left ( 一-\ mathrm { src } _ { A } \ right ) \ end { cases } } $
伽瑪校正
計算機圖像一般無直接存儲光照光度對應的 RGB 值,是需要先對這寡值做伽瑪校正。
伽瑪校正的大致過程如下:
- 設 $ displayed _ { RGB } $ 為屏幕頂顯示的 RGB 光度(標準化了後的光度值,佇咧零佮一之間)
- 設 $ stored _ { RGB } $ 為計算機內底所存儲的 RGB 光度(嘛是標準化了後的光度值)
- 設 $ \ gamma $ 為用於「解碼」$ stored _ { RGB } $ 圖像的伽瑪值二交二(二孵二是 $ \ gamma $ 的典型取值)
則𪜶三者之間的關係為
- $ displayed _ { RGB }={ stored _ { RGB } } ^ { \ gamma } $
所以,咧處理計算機圖像的 RGB 值時(尤其是做 Alpha 透濫的時), 會當佇處理前先將伽瑪校正消除,完成處理了閣重新做伽瑪校正,按呢做的效果比直接處理伽瑪校正後的 RGB 值要好。
譬如講有一張圖片 $ overlay _ { rgb } $,伊對應的 Alpha 通道為 $ overlay _ { \ alpha } $,這馬欲共疊甲背景圖 $ background _ { rgb } $ 上,遐爾仔最終的圖像 $ out _ { rgb } $ 會當按呢算講:
- $ out _ { rgb }=( { overlay _ { rgb } } ^ { \ gamma } \ times overlay _ { \ alpha } + { background _ { rgb } } ^ { \ gamma } \ times ( 一-overlay _ { \ alpha } ) ) ^ { 一 / \ gamma } $
此處的 $ out _ { rgb } $ 是算機內存中所存儲的數據;佇計算機顯示器上會以 $ out _ { rgb } ^ { \ gamma } $ 的數據顯示。