Photoshopの「白黒」調整レイヤーの背後にあるアルゴリズムは何ですか?


11

フォトショップの「白黒」調整レイヤーの背後にあるアルゴリズムについて誰かが説明できますか?

Photoshopスクリーンショット

画像から赤/マゼンタではないピクセルを強調するアプリケーション(パーセントのような構成可能な許容誤差を使用)をC ++を使用して再現する必要があり、このリソースは私が期待する動作を示しました。


それでも再現できませんでしたが、手がかりを見つけました。

各ピクセルは、最大2つのコントロール、1つの加算(RGB)と1つの減算(CMY)によって定義されます。


アルゴリズムの理解に近づいたことはありますか?私もこれを理解しようとしています。
ピザフィルム2013年

いいえ、私はしませんでした:/
Blamoo 2013年

回答:


4

アルゴリズムをMATLABで完全に複製しました(@ Ivan Kuckirの回答に基づく):

function [ mO ] = ApplyBlackWhiteFilter( mI, vCoeffValues )

FALSE   = 0;
TRUE    = 1;

OFF = 0;
ON  = 1;

numRows = size(mI, 1);
numCols = size(mI, 2);
dataClass = class(mI);

numCoeff    = size(vCoeffValues, 1);
hueRadius   = 1 / numCoeff;
vHueVal     = [0:(numCoeff - 1)] * hueRadius;

mHsl = ConvertRgbToHsl(mI);
mO = zeros(numRows, numCols, dataClass);

vCoeffValues = numCoeff * vCoeffValues;

for jj = 1:numCols
    for ii = 1:numRows
        hueVal = mHsl(ii, jj, 1);
        lumCoeff = 0;

        % For kk = 1 we're dealing with circular distance
        diffVal     = min(abs(vHueVal(1) - hueVal), abs(1 - hueVal));
        lumCoeff    = lumCoeff + (vCoeffValues(1) * max(0, hueRadius - diffVal));
        for kk = 2:numCoeff
            lumCoeff = lumCoeff + (vCoeffValues(kk) * max(0, hueRadius - abs(vHueVal(kk) - hueVal)));
        end

        mO(ii, jj) = mHsl(ii, jj, 3) * (1 + lumCoeff);
    end
end


end

からvPhotoshopValuesへの変換vCoeffValuesはのように行う必要があることに注意してくださいvCoeffValues = (vPhotoshopValues - 50) ./ 50
Photoshopの値は[-200、300]であり、を使用して[-5、5]に線形にマッピングする必要があり50 -> 0ます。

Photoshopとの比較は次のとおりです。

ここに画像の説明を入力してください

最大誤差は、[0、255]の範囲で1未満です。

完全なコードは、私のStackExchange Signal Processing Q688 GitHubリポジトリで入手できます


8

各(カラー)画像は、RGBコンポーネントで構成されています。REDコンポーネントのすべてのピクセルに定数値を追加(または削減)すると、REDタブを右に移動するのと同じ効果が表示されます。同じ方法で、REDコンポーネントを定数で削減すると、逆の効果が得られます。

同様に、説明したように、固定値で各コンポーネントを増減できます。すべてのRGBコンポーネントを同じ値だけ増減すると、これは明るさの変更と同じになります(基本的には、白色を追加/削除します)。

シアン、ブルー、マゼンタ-CMYK色空間でのこのような変換に対応します。(ただし、この色空間の青はシアンと黄色の混合に対応していると思います。これは少しトリッキーです。変換は基本的にすべて同じです。

最後の要素Tint:{Hue and Saturation}は同じ操作に対応しますが、ここではまず画像がHSVモデルで変換され、次にHUEとSaturationが個別に追加/減算されます。

文字盤のマーカーと対応する番号の正確な関係についてはわかりませんが、実用的な値を試してみるとわかります。


1
RGBとCMYがあるので、2つのカラースペースのいずれかに変換するだけで、好きなだけ調整できます。調整が完了したら、他のトリプレットを更新することを忘れないでください。
ジョナス

この答えは正しくなく、不完全だと思います。1. PSの実装では、「青」のスライダーをスライドしてもシアンっぽいピクセルの明るさに影響はなく、「シアン」のスライダーをスライドしても青っぽいピクセルの明るさには影響しません。この回答で説明されているこのアプローチは、そのようには機能しません。2. RGBCMYコンポーネントが操作された後、それらがどのようにしてグレースケールに変換されるかは記述していません(おそらくdotProduct(color, vec3(0.2989, 0.5870, 0.1140)操作です)。3.青は、どの色空間でも「シアンと黄色の混合に対応」していません。
Stefan Monov 2017年

4.ティント操作がグレースケールに変換された後ではなく、その前に実行されることは言及していません。
Stefan Monov 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.