了解 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,因为它比链接代码中的 src
和 dst
更合乎逻辑;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
这个问题是关于我在已接受的答案中需要的关于实施 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,因为它比链接代码中的 src
和 dst
更合乎逻辑;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