這個問題是關于我在接受的答案中需要澄清的關于實作 alpha 混合的正確方法(此處提供的鏈接): How to do alpha compositing with a list of RGBA data in numpy arrays?
在填充輸出影像的 RGB 值的步驟中,除以預先計算的輸出 alpha 值(粘貼在下面的相關片段)
# Work out resultant RGB
outRGB = (srcRGB*srcA[...,np.newaxis] dstRGB*dstA[...,np.newaxis]*(1-srcA[...,np.newaxis])) / outA[...,np.newaxis]
我想了解為什么會這樣做。不只是乘以 srcA 和 dstA,就像在分子中所做的那樣,就足夠了嗎?額外的除法似乎改變了混合操作的因素。例如,如果 srcA 為 0.5,dstA 也為 0.5,則兩幅影像的貢獻應該相等,為 50%。但是,根據上述情況, src 的權重為 2/3,而 dst 的權重為 1/3。
PS:在這里作為一個單獨的問題而不是在那里發表評論,因為我是新手并且沒有足夠的聲譽點來在那里發布問題。
uj5u.com熱心網友回復:
當將結果outRGB與背景混合時,使用outAalpha,一個將outRGB乘以outA. 這就是為什么我們需要除以outA。
考慮先將 B 與背景混合,然后將 A 放在頂部(使用 A 和 B,因為它比鏈接代碼中的srcand更合乎邏輯;鏈接頁面也使用 A 和 B)。我們稱背景為 X,Y 是在 X 上混合 B 的結果。是顏色 A 的 alpha 等:dstalpha_A
Y = B * alpha_B X * (1-alpha_B)
out = A * alpha_A Y * (1-alpha_A)
= A * alpha_A (B * alpha_B X * (1-alpha_B)) * (1-alpha_A)
= A * alpha_A B * alpha_B * (1-alpha_A) X * (1-alpha_B) * (1-alpha_A)
= A * alpha_A B * alpha_B * (1-alpha_A) X * (1 - (alpha_A alphaB * (1-alpha_A)))
如果我們現在out再次從背景中分離出來(我們稱之為顏色 C),我們必須有:
out = C * alpha_C X * (1-alpha_C)
所以比較兩個方程:
out = A * alpha_A B * alpha_B * (1-alpha_A) X * (1 - (alpha_A alphaB * (1-alpha_A)))
out = C * alpha_C X * (1-alpha_C)
我們必須有:
alpha_C = alpha_A alphaB * (1-alpha_A)
C * alpha_C = A * alpha_A B * alpha_B * (1-alpha_A)
后一個可以重寫為:
C = (A * alpha_A B * alpha_B * (1-alpha_A)) / alpha_C
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/462355.html
下一篇:如何插入額外的所需列和行?
