分版
RGBやCMYKのようなオーソドックスな色空間に限らず、2色刷り、YCbCr、特色印刷など、さまざまな「版(チャンネル)」のとり方を考えてみる。
(baku89.icon 自作エフェクト用に、色々メモりながら書いてます)
RGB -> CMYK
$ \overline{R} = 1 - R, \overline{G} = 1 - G, \overline{B} = 1 - B とする。
つまり、黒からのプラス分ではなく、白からのマイナス分としてRGB各チャンネルを捉える。
このとき、
$ K = min(\overline{R}, \overline{G}, \overline{B})
$ C = \frac{\overline{R} - K}{1 - K}, M = \frac{\overline{G} - K}{1 - K}, Y = \frac{\overline{B} - K}{1 - K}
イメージ
https://scrapbox.io/files/6322c48b4f577b001d7c9c11.png
特色印刷
CMYK以外のインクの色を重ね刷りして、カラー画像を印刷する方法を考えてみる。(実際の入稿ではあまりそういうことはしないけれど。せいぜい2色刷りか。)
要するに、線形変換。一旦RGのみについて考えてみる。
「オレンジ」「黄緑」に分版するには、あるピクセルの色を、特色それ自体のRGB値を基底とした座標系における座標値に変換すればいい。
https://scrapbox.io/files/63232c2cff25a80021ba0ece.png
単純なコード。
code:spot-color-separation.glsl
mat3 m = mat3(spotColorR, spotColorG, spotColorB);
// 特色3色に
vec3 spotColors = invert(m) * inputRGB;
// 元にもどす
vec3 rgb = m * spotColors;
しかし図を見ると分かるように、赤100%付近の色などは分版後に0...1の範囲外の値をとることがある。また、同じ色の特色を使った場合など、特色空間の基底が線形独立ではない場合も、(invert(m)が計算できない、分版が一意に出来ないため)チャンネルがNaNとなるのに注意。
ISF(Interactive Shader Format) での実装例。