GIMP的图层合成/混合方法

时间:2016-05-12 14:29:35

标签: colors alpha gimp blending compositing

为了在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论坛最好的问题,但我认为接触普通观众会更有成效。澄清和总结:

  • 透明BG区域的颜色是否不受不透明前景色的影响?这种风险不会导致硬掩模边缘附近未经改变的数据出血以及未来的某些操作吗?
  • 虽然我找不到任何东西,但还有其他应用吗? 在那里使用这种方法?
  • 我错误地使用GIMP的行为作为参考吗?我没有PS 比较,ImageMagick是如此灵活,以至于它没有 真的建议一个特定的预期行为。当然,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;

然后做一些代数,如果你想简化它。

0 个答案:

没有答案