フォトショップの「白黒」調整レイヤーの背後にあるアルゴリズムについて誰かが説明できますか?
画像から赤/マゼンタではないピクセルを強調するアプリケーション(パーセントのような構成可能な許容誤差を使用)をC ++を使用して再現する必要があり、このリソースは私が期待する動作を示しました。
それでも再現できませんでしたが、手がかりを見つけました。
各ピクセルは、最大2つのコントロール、1つの加算(RGB)と1つの減算(CMY)によって定義されます。
フォトショップの「白黒」調整レイヤーの背後にあるアルゴリズムについて誰かが説明できますか?
画像から赤/マゼンタではないピクセルを強調するアプリケーション(パーセントのような構成可能な許容誤差を使用)をC ++を使用して再現する必要があり、このリソースは私が期待する動作を示しました。
それでも再現できませんでしたが、手がかりを見つけました。
各ピクセルは、最大2つのコントロール、1つの加算(RGB)と1つの減算(CMY)によって定義されます。
回答:
アルゴリズムを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リポジトリで入手できます。
各(カラー)画像は、RGBコンポーネントで構成されています。REDコンポーネントのすべてのピクセルに定数値を追加(または削減)すると、REDタブを右に移動するのと同じ効果が表示されます。同じ方法で、REDコンポーネントを定数で削減すると、逆の効果が得られます。
同様に、説明したように、固定値で各コンポーネントを増減できます。すべてのRGBコンポーネントを同じ値だけ増減すると、これは明るさの変更と同じになります(基本的には、白色を追加/削除します)。
シアン、ブルー、マゼンタ-CMYK色空間でのこのような変換に対応します。(ただし、この色空間の青はシアンと黄色の混合に対応していると思います。これは少しトリッキーです。変換は基本的にすべて同じです。
最後の要素Tint:{Hue and Saturation}は同じ操作に対応しますが、ここではまず画像がHSVモデルで変換され、次にHUEとSaturationが個別に追加/減算されます。
文字盤のマーカーと対応する番号の正確な関係についてはわかりませんが、実用的な値を試してみるとわかります。
dotProduct(color, vec3(0.2989, 0.5870, 0.1140)
操作です)。3.青は、どの色空間でも「シアンと黄色の混合に対応」していません。