And*_*tan 87
我赞成约翰内斯的答案,因为他是对的.
*一些评论已被提出,我原来的答案是不正确的.如果alpha值与正常值相反,它就有效.但是,根据定义,这在大多数情况下都不起作用.因此,我已将下面的公式更新为正常情况.这最终等于@ hkurabko的回答*
然而,更具体的答案是将alpha值合并到基于不透明背景颜色(或其所指的"遮罩")的实际颜色结果中.
有一个算法(从这个维基百科链接):
Source.BGColor 说明(再次,选择哑光)如果背景颜色也是透明的,那么你就必须先为递归的过程中获得此操作的源RGB - .现在,转换定义为(在这里完整的伪代码!):
Source => Target = (BGColor + Source) =
Target.R = ((1 - Source.A) * BGColor.R) + (Source.A * Source.R)
Target.G = ((1 - Source.A) * BGColor.G) + (Source.A * Source.G)
Target.B = ((1 - Source.A) * BGColor.B) + (Source.A * Source.B)
Run Code Online (Sandbox Code Playgroud)为了得到最后的0-255值,Target你只需乘以所有的标准值备份通过255,确保你在255上限,如果任何合计值超过1.0(这是过度暴露和有处理这种更复杂的算法涉及整个图像处理等).
编辑:在你的问题中,你说你想要一个白色背景 - 在这种情况下,只需将BGColor修复为255,255,255.
hku*_*bko 37
嗯......关于
http://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending
Andras Zoltan提供的解决方案应略微改为:
Source => Target = (BGColor + Source) =
Target.R = ((1 - Source.A) * BGColor.R) + (Source.A * Source.R)
Target.G = ((1 - Source.A) * BGColor.G) + (Source.A * Source.G)
Target.B = ((1 - Source.A) * BGColor.B) + (Source.A * Source.B)
Run Code Online (Sandbox Code Playgroud)
这个改变版本对我来说很好,因为在prev.带有matte rgb(ff,ff,ff)的版本rgba(0,0,0,0)将更改为rgb(0,0,0).
小智 9
就我而言,我想将 RGBA 图像转换为 RGB,以下操作按预期工作:
rgbImage = cv2.cvtColor(npimage, cv2.COLOR_RGBA2RGB)
Run Code Online (Sandbox Code Playgroud)
这取决于您使用的色彩空间。如果 RGBA 在预乘颜色空间中并且是半透明的,则需要除掉 alpha 以获得正确的 RGB 颜色。如果颜色在非预乘颜色空间中,那么您可以丢弃 alpha 通道。