减去颜色并提取透明度值

减去颜色并提取透明度值

假设将一张图片设为半透明,并添加纯色背景。原始图片、背景色和结果(混合)已知。但是,添加的透明度(alpha 值)未知,并且会随着图片而变化。有没有一种自动方法可以计算图像每个像素添加的透明度值?我们可以复制这些值并应用于另一张图片吗?

[ 图片 + 透明度(未知且不同) ] + FlatBackground = 混合(不透明)

= [ 半透明图片 ] + FlatBackground = Mix(opaque)

复制每个添加的与图片像素对应的透明度值的示例:

for pixel(0,0) added 127
for pixel(1,0) added 124
for pixel(0,1) added 124
for pixel(1,1) added 120

但我当然不想打印这些值。我只想像使用 mask(?) 一样使用它。这样,我可以将这些值应用到另一张图片以创建相同的效果。

答案1

透明度乘以原始像素,而不是加到原始像素上,以获得混合像素。请参阅PNG 规范

假设 8 位颜色样本范围从 0 到 255,并标准化为范围 0 到 1.0,对图像中的每个像素执行此操作:

m = Mix/255
p = Picture/255
a = alpha = Transparency/255

m = (p * a) + (b * (1.0 - a))

求解“a”

a = (m - b) / (p - b)

转换回原始范围,例如 0..255:

Transparency = a * 255

不幸的是,这意味着您无法从所有像素中提取透明度 (alpha)。特别是,当 Picture == Background (p - b == 0) 时,透明度可以是 0..255 范围内的任何值(a == 0.0 到 1.0 之间的任何值);如果您在代码中使用此公式,则需要防止除以零。

当图片背景非零时,则可以获得透明度,但是当差异(p - b)较小时,它不是很准确。

相关内容