减去混合模式

Subtract Blending Mode

我一直在尝试将 GIMP (GEGL) 的一些图层混合模式实现到 Python。目前,我停留在减法混合模式。根据 documentationSubtract = max(Background - Foreground, 0)。但是,在 GIMP 中使用 Background image = (205,36,50)Foreground image = (125,38,85) 进行简单测试,得到的复合 image/colour 变为 (170, 234, 0),这与上面的数学不完全一致。

据了解,Subtract 不使用 Alpha Blending。那么,这可能是一个合成问题吗?或者减法遵循不同的数学?更多详细信息和背景可以在单独的 SO 问题中找到。

编辑 [14/10/2021]: 我尝试使用 this 图像作为我的来源。对 [0, 1]:

范围内归一化的图像执行以下步骤
  1. 应用颜色减淡(之前没有从 sRGB -> linear RGB 进行转换)并从我的实现中获得 this 与 GIMP 结果相匹配。
  2. sRGB -> linear RGB 对颜色减淡和源图像进行转换。 [Reference]
  3. 应用减法与 Background = Colour DodgeForeground = Source Image
  4. 混合
  5. 重新转换 linear RGB-> sRGB

我得到this from POC. Left RGB triplet: (69,60,34); Right RGB triplet: (3,0,192). And the GIMP result。左 RGB 三元组:(69,60,35);右 RGB 三元组:(4,255,255)

如果您正在查看 0 ➞ 255 范围内的通道值,则它们可能经过了伽玛校正。操作可能是这样的:

  • 使用
  • 之类的方法将每一层转换为 0.0 ➞ 1.0 范围内的“线性光”
L = ((V/255) ** gamma) (*)
  • 应用“差异”公式
  • 将结果转换回伽马校正后的结果:
V = (255 * (Diff ** (1/gamma)))

使用 gamma=2.2,您在红色通道上获得 170,但我不明白为什么您在绿色通道上获得 234。

(*) 对于非常低的值 IIRC,实际公式有一个特例。