将RGBA颜色转换为RGB

jac*_*ack 74 rgb image colors

如何将RGBA颜色元组(例如96,96,96,202)转换为相应的RGB颜色元组?

编辑:

我想要的是在白色背景上获得与RGBA元组最相似的RGB值.

And*_*tan 87

我赞成约翰内斯的答案,因为他是对的.

*一些评论已被提出,我原来的答案是不正确的.如果alpha值与正常值相反,它就有效.但是,根据定义,这在大多数情况下都不起作用.因此,我已将下面的公式更新为正常情况.这最终等于@ hkurabko的回答*

然而,更具体的答案是将alpha值合并到基于不透明背景颜色(或其所指的"遮罩")的实际颜色结果中.

有一个算法(从这个维基百科链接):

  • 归一化RGBA值,使它们都在0和1之间 - 只需将每个值除以255即可.我们会调用结果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.

  • 根据问题编辑,这是一个非常准确和良好的答案.我删除了我的,希望你泡起来,因为你解释了事情的方式更好:) (9认同)
  • 如果仍然有人感兴趣,可以使用此JSBin观看正在变换的颜色。也可以用作javacript函数。我将BGColor用作白色,因为我只是不了解遮罩的概念(对不起!)。链接如下:http://jsbin.com/qocixeh/edit?html,js,控制台,输出以及要点:https://gist.github.com/vladimirbrasil/bd139851ff757a1c8cb46fac93e733eb希望它也能有所帮助。数以千计的感谢您的回答! (2认同)

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).

  • Andras将0 alpha定义为不透明,将255定义为透明,而CSS则将其定义为相反的方式.这个答案适用于CSS的alpha定义. (4认同)

小智 9

就我而言,我想将 RGBA 图像转换为 RGB,以下操作按预期工作:

rgbImage = cv2.cvtColor(npimage, cv2.COLOR_RGBA2RGB)
Run Code Online (Sandbox Code Playgroud)


kus*_*sma 5

这取决于您使用的色彩空间。如果 RGBA 在预乘颜色空间中并且是半透明的,则需要除掉 alpha 以获得正确的 RGB 颜色。如果颜色在非预乘颜色空间中,那么您可以丢弃 alpha 通道。