为了在Matlab中为我的图像混合工具添加alpha容量,我遇到了一些障碍。除其他外,我一直在使用these links作为我的参考,以了解前景和背景alpha如何影响输出颜色数据和输出alpha的组合。
我最初的方法是简单地使用 Src-Over 组合作为" normal"其他模式的混合模式和 Src-Atop 组合。与GIMP的输出相比,这产生了类似但不同的结果。输出alpha匹配,但RGB数据不同。
具体而言,前景对背景的颜色影响为零,背景alpha为零。在通过GIMP 2.8.10源代码看了几个小时后,我注意到一些令我困惑的事情。
除了在导出过程中发生的某些模式和一些辅助事物,我还没有在代码中收集到,这种方法大致是这样的:
if ~normalmode
FGalpha = min(FGalpha, BGalpha); % << why this?
end
FGalpha = FGalpha * mask * opacity;
OUTalpha = BGalpha + (1 - BGalpha) * FGalpha;
ratio = FGalpha / (OUTalpha + eps);
OUT = OUT * ratio + BG * (1 - ratio);
if normalmode
OUT = cat(3, OUT, OUTalpha);
else
OUT = cat(3, OUT, BGalpha);
end
好奇心在于我从概念上理解为什么人们会为构图采用最小的alpha值。当然,这种方法可以产生与GIMP相匹配的结果,但是如果我不理解推理,我很难将其确定为默认行为。
这可能是某个GIMP论坛最好的问题,但我认为接触普通观众会更有成效。澄清和总结:
编辑: 我至少可以通过避免它来回答最后一个问题。我决定添加对SVG 1.2和传统GIMP方法的支持。 GIMP将来使用的GEGL方法遵循SVG方法,因此我认为这表明了遗留方法的适当性。
对于它的价值,SVG方法都基于Porter-Duff Src-Over 组合。如果参考文档,混合数学相同的事实会被混淆,因为混合和组合使用预乘alpha进行代数组合以降低总体计算成本。除SoftLight外,核心混合数学与GIMP和其他地方使用的数学相同。
任何其他混合操作(例如PinLight,Hue)都可以通过以下方式实现兼容:
As = Sa * (1 - Da);
Ad = Da * (1 - Sa);
Ab = Sa * Da;
Ra = As + Ad + Ab; % output alpha
Rc = ( f(Sc,Dc)*Ab + Sc*As + Dc*Ad ) / Ra;
然后做一些代数,如果你想简化它。