2

Matlab のイメージ ブレンディング ツールにアルファ容量を追加しようとしているときに、ちょっとした問題に遭遇しました。とりわけ、前景と背景のアルファが出力カラー データと出力アルファの両方の構成にどのように影響するかについて、これらの リンクを参照として使用してきました。

私の最初のアプローチは、単純に「通常の」ブレンド モードにはSrc-Over合成を使用し、他のモードにはSrc-Atop合成を使用することでした。GIMP からの出力と比較すると、同様の結果が得られましたが、異なる結果が得られました。出力アルファは一致しますが、RGB データは異なります。

具体的には、背景のアルファがゼロの場合、背景に対する前景の色の影響はゼロです。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

好奇心のポイントは、構成に最小のレイヤーアルファを使用する理由を概念的に理解していないという事実にあります。確かに、このアプローチは GIMP に一致する結果を生成しますが、理由が理解できない場合、これをデフォルトの動作として確立するのは気が進まないです。


これはどこかの GIMP フォーラムに尋ねるのが一番良いかもしれませんが、一般の聴衆にアプローチする方が実り多いと思いました。明確にして要約するには:

  • 透明な BG 領域の色が、不透明な前景色との乗算の影響を受けないというのは理にかなっていますか? このリスクにより、ハード マスクのエッジ付近で変更されていないデータが流出する可能性はありますか?
  • 何も見つかりませんでしたが、このアプローチを使用する他のアプリケーションはありますか?
  • GIMP の動作を参考にするのは間違っていますか? 比較する PS はありません。また、ImageMagick は非常に柔軟であるため、特定の予想される動作を実際に示唆するものではありません。確かに、GIMP には間違った動作がいくつかあります。多分これは変わるかもしれない何かです。

編集:少なくとも、最後の質問を省略することで答えることができます。SVG 1.2 と従来の GIMP メソッドの両方のサポートを追加することにしました。今後 GIMP で使用される GEGL メソッドは SVG メソッドを踏襲しているため、従来のメソッドの妥当性を示唆していると考えられます。

価値のあることとして、SVG メソッドはすべて Porter-Duff Src-Over構成に基づいています。ドキュメンテーションを参照すると、ブレンドと構成が事前に乗算されたアルファを使用して代数的に結合され、全体的な計算コストが削減されるため、ブレンドの計算が同じであるという事実が難読化されます。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;

単純化する場合は、代数を実行します。

4

0 に答える 0