在計算機圖形學領域中，Alpha 合成，又稱 Alpha 混合，是一種將影像與背景結合的過程，結合後可以產生部分透明或全透明的視覺效果。Alpha 合成也叫阿爾法合成或透明合成。渲染影像時，通常會將目標影像中的多個子元素單獨渲染，最後再把多張子元素的圖片為單獨的影像。例如，電視直播時就會將大量計算機生成的影像元素合成到現場鏡頭上。 要正確結合影像元素，每個元素的必須有對應的。遮片包含覆蓋範圍資訊 圖中幾何物件的形狀 可以藉此分辨影像中的任意位置到底是被繪製的幾何物件本身，還是邏輯上的「空白」區域。 描述 為了儲存遮片資訊，匠白光提出了 Alpha 通道的概念，後由和完善。（見 pixarcom ）二維影像裡記錄著每個畫素的顏色資訊，額外的資訊以 0 和 1 之間的值表示，記錄在 Alpha 通道里。0 表示該畫素沒有覆蓋資訊，是透明的，即圖中的幾何體沒有覆蓋到本畫素；而 1 則表示畫素不透明，幾何體完全覆蓋了此畫素。 影像中使用的 Alpha 通道通常有兩種表示形式：平直 Alpha和預乘 Alpha。 如果使用平直 Alpha，影像中的 RGB 分量僅表示畫素的顏色，與是否透明無關。 如果使用預乘 Alpha，影像中的 RGB 分量也表示畫素的顏色，但事先已經和不透明度做了乘法。某些使用場景下，這樣的做法可以在後續合成時節省一次乘法。不過預乘 Alpha 的最顯著優勢在於使用簡單、準確而非效能。 如果用平直的（非預乘）RGBA 元組表達畫素顏色，那麼畫素值 0 07 0 05 表示畫素有 70 的最大綠色亮度，同時不透明度是 50。同樣條件下的純綠色是 0 1 0 05。而如果用預乘 Alpha，此處的 RGB 值 0 07 0 需要都乘以 05，表達為 0 035 0 05。雖然此處 G 通道的值是 035 ，但它表示的還是最大亮度的 70（其中包含了 50 的不透明度）。此時的純綠色則需要表達為 0 05 0 05。因此，瞭解影像（檔案）到底使用的是平直 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 1 alpha_aright C_o frac C_a alpha_a C_b alpha_b left 1 alpha_arightalpha_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 1 alpha_aright 結果中的 Alpha 值即： alpha_o frac c_oC_o alpha_a alpha_b left 1 alpha_aright over 運算子的解析推導 透過研究正交覆蓋，Porter 和 Buff 給出了 alpha 合成的幾何解釋。在 1981 年 Bruce A Wallace 的論文裡則給出了另一種基於的反射率 透過率的物理模型的另一種推導。 第三種推導方法透過使用兩條簡單的假設得到。為了簡單起見，我們將 over 運算子簡記成 a odot b。 第一條假設是當背景是不透明（即 alpha_b 1）時，over 運算子表示前景顏色與背景顏色的凸組合： C_o alpha_a C_a 1 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 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 這個式子的兩邊都滿足 X_0 Y_0 C_c X_1 Y_1 C_c 的形式，令 X_0 X_1 且 Y_0 Y_1，可以得到： begin align alpha_o 1 1 alpha_a 1 alpha_b C_o frac alpha_a C_a 1 alpha_aalpha_b C_balpha_o end align 至此，我們推匯出了 o a odot b 的顏色和其 alpha 分量的解析式。 注意到 1 alpha_aalpha_b alpha_o alpha_a，這樣，上式可以緊湊地表示成 C_o frac alpha_aalpha_o C_a left 1 frac alpha_aalpha_oright C_b odot 運算子滿足非交換么半群的定義。這個群的單位元 e 是所有滿足 alpha 0 的二元組 langle Calpharangle，這可以透過式子 e odot a a odot e a 得到。 Alpha 混合 Alpha 混合是將半透明的前景色與背景色結合的過程，可以得到混合後的新顏色。前景色的透明度不限，從完全透明到完全不透明都可以。如果前景色完全透明，混合後的顏色就是背景色；如果前景色完全不透明，混合後的顏色就是前景色；如果在這兩種極端情況之間，混合後的顏色可以透過前景色和背景色的加權平均計算。 Alpha 合成後的顏色可以這樣計算： 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 如果背景色不透明，即 dst_A 1，代入上述方程後可以得到： 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，最初的方程組可以簡化為： 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 伽瑪校正 計算機影像一般不直接儲存光照亮度對應的 RGB 值，而是需要先對這些值做伽瑪校正。 伽瑪校正的大致過程如下： 設 displayed_RGB 為螢幕上顯示的 RGB 亮度（標準化後的亮度值，在 0 和 1 之間） 設 stored_RGB 為計算機記憶體中所儲存的 RGB 亮度（也是標準化後的亮度值） 設 gamma 為用於「解碼」stored_RGB 影像的伽瑪值 22（22 為 gamma 的典型取值） 則它們三者之間的關係為 displayed_RGB stored_RGB gamma 因此，在處理計算機影像的 RGB 值時（尤其是做 Alpha 混合時），可以在處理前先將伽瑪校正消除，完成處理後再重新做伽瑪校正，這樣做的效果比直接處理伽瑪校正後的 RGB 值要好。 例如有一張圖片 overlay_rgb，它對應的 Alpha 通道為 overlay_alpha，現在要把它疊加到背景圖 background_rgb 上，那麼最終的影像 out_rgb 可以這樣計算： out_rgb overlay_rgbgamma times overlay_alpha background_rgbgamma times 1 overlay_alpha 1gamma 此處的 out_rgb 是計算機記憶體中所儲存的資料；在計算機顯示器上會以 out_rgb gamma 的資料顯示。 參考資料 Category 計算機圖形學