了解 alpha 混合操作

Understanding alpha blending operation

这个问题是关于我在已接受的答案中需要的关于实施 alpha 混合的正确方法的澄清(link 在此处提供):

在填充输出图像的 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。

P.S:在这里作为一个单独的问题提问,而不是在那里发表评论,因为我是新手并且没有足够的声誉点post在那里提出问题。

将生成的 outRGB 与背景混合时,使用 outA 作为 alpha,将 outRGB 乘以 outA。这就是为什么我们需要除以 outA.

考虑先将 B 与背景混合,然后在顶部混合 A(使用 A 和 B,因为它比链接代码中的 srcdst 更合乎逻辑;linked page 也使用 A 和 B)。我们称背景为 X,Y 是在 X 上混合 B 的结果。alpha_A 是颜色 A 的 alpha,等等:

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