PhotoShop に初めて触れた人は、あまりに多彩なレイヤーや描画の ブレンドモード に戸惑うのではないでしょうか。しかも、PhotoShop のヘルプの記述は抽象的で感覚的な表現が多いので、いまいち用途や意味が不明だったりします。このドキュメントでは、実際に絵を描く上で役に立ちそうな実践的なサンプルを交えて、全ブレンドモードの意味を考えていきたいと思います。
このドキュメントでの変数や用語を定義しておきます。話を厳密にするために書いておくものですので、よく分からなければ読み飛ばしてもかまいません。Pa、Pb、Pn の3つの変数を使います。
- Pa :
- 重ねられるレイヤー(下)の任意のチャンネル( RGB 3つのうちのどれか)の任意のピクセルの明度(PhotoShop のヘルプで「基本色」とされているもの)で、 0~255 の整数で表す。
- Pb :
- 重ねるレイヤー(上)上の、Pa と同じチャンネルの同じ位置のピクセルの明度
(PhotoShop のヘルプで「合成色」とされているもの)で、0~255 の整数で表す。
- Pn :
- 最終的に混ぜ合わされて表示される明度で、0~255 の整数で表す。
PhotoShop 上でのビット深度(値の範囲)は通常 8 ビットで、値の範囲は 0 ~ 255 の整数なのですが、これだと式が汚らしくなるので値の範囲を 0 ~ 1 とした場合の式も載せてみます。
もっとも単純にして理解し易くかつ応用範囲も広いモードです。不透明度や透明部分の保護などを利用すれば幅広い表現ができます。不透明度を下げた場合、下のレイヤーとの平均混色となります。
ぼかしたり不透明度を下げたりしないとあまり意味がありません。基本的に合成結果は通常モードと一緒ですが、合成にディザ拡散を使い、見かけ上色を合成します。広義の平均混色、または並置混色などと呼ばれる手法です。
拡散方法については調べてないのでよく分かりません。
使おうと思えば波や砂目などの描写に使えるのですが、あまり狙い通りに拡散してくれないことが多いので、レイヤーは通常などのままにしておいてディザモードのブラシで描画した方が、フィルタなども使えるので汎用性が高まるでしょう。
レタリングなどで上手く使えばそれなりに面白いかと思います。
直感的に結果を理解できるモードです。下のレイヤーとの減法混色になります。陰(shade)部分を塗るなどさまざまな部分で頻繁に利用されます。
計算式は
Pn = Pa * Pb / 255
Pn、Pa、Pb を0~1の範囲とする場合は、
Pn = Pa * Pb
です。正に乗算。
ハイライトを入れるために使えます。乗算の結果色の(直感的な)予想しやすさに比べ、スクリーンの結果色を予想するには結構慣れが要ります。下のレイヤーとの加法混色になります。
計算式は
Pn = Pa + Pb - Pa * Pb / 255
Pn、Pa、Pb を0~1の範囲とする場合は、
Pn = 1 - ( ( 1 - Pa ) * ( 1 - Pb ) )
となります。2進数的にはビット反転してかけ合わせてビット反転。
明度の高い部分と低い部分の鮮やかさが上がります。彩かさが上がるため、画像全体にかけると一見キレイになったかのような錯覚に陥りやすいので、注意しましょう。錯覚です。
全体の色調を統一するためや塗り斑、主線に色を付けるためなどによく利用されています。
計算式は以下のようになります。重ねられるレイヤー(下のレイヤー)の中間値で乗算とスクリーンを使い分けているようです。
Pa < 128 の場合
Pn = Pa * Pb * 2 / 255
Pa >= 128 の場合
Pn = 2 * (Pa + Pb - Pa * Pb / 255) - 255
です。
Pn、Pa、Pb を0~1の範囲とする場合、
Pa < 0.5のとき
Pn = Pa * Pb * 2
Pa >= 0.5のとき
Pn = 1 - 2 * ( 1 - Pa ) * ( 1 - Pb )
となります。
ヘルプでは覆い焼きと焼き込みの使い分けと言っていますが、値を実測してプロットしてみるとどうもその通りになりません。ヘルプに不正確なこと書くなー。下のレイヤーに対して、唯一指数関数的に影響を与えるモードです。
これも全体の色調を統一する時に使えます。オーバーレイではピーキーに鮮やかな色になりますが、ソフトライトは指数曲線を描くのでそうはなりません。
計算式は以下の通りです。^ はべき乗を表します。
Pb < 128の時
Pn = ( Pa / 255 ) ^ ( ( 255 - Pb ) / 128 ) * 255
Pb >= 128の時
Pn = ( Pa / 255 ) ^ ( 128 / Pb ) * 255
Pn、Pa、Pb を0~1の範囲とする場合、
Pb < 0.5の時
Pn = Pa ^ ( 2 * (1 - Pb ) )
Pb >= 0.5の時
Pn = Pa ^ ( 1 / ( 2 * Pb ) )
この類のレイヤーモードがやや分かり難いのは、輝度に対して知覚的に変化するのではなく、RGB 値に対して算術的に効果が表れる点だと思います。これは、RGB モードで画像を操作する時の欠陥であり、絵画的な直感に反します。現状では慣れるしかないと思います。輝度については後述部分か、
HSB 値と輝度の求め方を参照。
計算式は以下のようになります。一見オーバーレイと同じように見えますが、重ねられるレイヤーではなく、重ねるレイヤー(上のレイヤー)の中間値で乗算とスクリーンを使い分けています。逆に言えば、重ねるレイヤーと重ねられるレイヤーを入れ替えると、オーバーレイと全く同じ結果が得られます。
Pb < 128の時
Pn = Pa * Pb * 2 / 255
Pb >= 128の時
Pn = 2 * ( Pa + Pb - Pa * Pb / 255 ) - 255
Pn、Pa、Pb を0~1の範囲とする場合、
Pb < 0.5の時
Pn = Pa * Pb * 2
Pb >= 0.5の時
Pn = 1 - 2 * ( 1 - Pa ) * ( 1 - Pb )
同じ画像同士を重ねると、明るい部分は一層明るく、暗い部分は一層暗くなるので、彩度が上がります。
覆い焼きは、ハイライトなどで頻繁に使われます。みつみ美里さん辺りがエヴァンジェリストでしょう。劇的に明るくなる上、彩度が大きく変わりますので、瞳や髪、肌のハイライトにちょっとだけ使うのがポイントです。金属らしさを表現する際にも使えます。
この関数は、ゼロ除算に注意してください。というか、露骨なゼロ除算だなぁ。
Pn = Pa * 255 / ( 255 - Pb )
ただし、Pb = 255 の場合及び Pn > 255 の場合、Pn = 255とする(こういうのを“saturate”というらしい)
Pn、Pa、Pb を0~1の範囲とする場合、
Pn = Pa / ( 1 - Pb )
PhotoShop6.0 では挙動が変わっています。6.0の関数は調べてないので知りません。レイヤーセットを使用すると、上記と同じ効果が得られます。
焼き込みは金属っぽさを表現できます。塗り斑に使うこともできます。ブラシを焼き込みモードにして陰(shade)部分を塗る人もいましたが、鮮やかになりすぎて金属っぽくなるので、そう意図していない限り止めた方が無難です。
計算式は以下の通りです。これもゼロ除算に注意してください。
Pn = 255 - (( 255 - Pa ) * 255 / Pb ))
ただし、Pb = 0 の場合及び Pn < 0 の場合、Pn = 0
Pn、Pa、Pb を0~1の範囲とする場合、
Pn = 1 - ( 1 - Pa ) / Pb
覆い焼き同様、PhotoShop6.0 では挙動が変わっています。レイヤーセットを使用すると、上記と同じ効果が得られます。
これはとても簡単。RGB 値のローパスフィルタと言っても好いかもしれません。上のレイヤーの RGB 値でカットオフします。
Pa >= Pb の時
Pn = Pb
Pa < Pb の時
Pn = Pa
特定の値以上を急激にカットしますから、ヒストグラムはイマイチな形になります。明度や輝度をコントロールするのが目的ならば、レベル補正を使うべきです。わざと画像を劣化させたり、RGB の特定チャンネルをカットする際には使えるかもしれません。背景のコントラストを落としたりとか。
RGB 値のハイパスフィルタ(なんて呼ぶとお叱りが来そうだが……)です。
Pa >= Pb の時
Pn = Pa
Pa < Pb の時
Pn = Pb
これもチャンネルの情報量を削ってヒストグラムを潰しますから、明度や輝度をコントロールするのが目的ならばレベル補正を使うべきです。
こういう風に画像を劣化させるのも、たまになら面白いですね。
下のレイヤーと同じ画像を重ねると真っ黒になるため、2枚の画像の差異を調べたり位置を合わせたりする際に利用できます。また、グレースケール画像の場合、ベタにかかる効果線などを自動的に白黒反転させたりすることができます。
値を求める関数自体は名前通りなので大変容易です。
Pn = | Pa - Pb |
RGB 値を反転させる時にも使えそうな気もするのですが、エッジ部分が汚くなるので、私はあまり好きではありません。また、反転した RGB 値は、輝度などの問題から視覚的な補色としてふさわしくないことが多い上に細かい調整がし難いので、色相や明度を調整して通常モードで乗せる方がずっと楽でしょう。
差の絶対値と似てるようで、実は違います。元の値とビット反転した値との差をビット深度で割ったものが傾きになる関数のようです。私は実際の作業で使ったことがありません。
計算式は以下の通り。
Pn = Pa + Pb -2 * Pa * Pb / 255
Pn、Pa、Pb を0~1の範囲とする場合は、
Pn = ( 1 - Pb ) * Pa + ( 1 - Pa ) * Pb
ソフトライトの項でも触れましたが、以上のブレンドモードは、RGB 各チャンネルに対して平等に働きます。これが、人間の感覚的な明るさの認識(心理物理量)と一致しないため、いまいち直感的ではないものもあると思います。例えば
覆い焼きでは、色によっては狙ったように明るくならないことがあります。これは残念ながら慣れるしかありません。
色相と輝度を利用したブレンドモードには以下の 4 つがあります。
- 色相(Hue)
- 彩度(Saturation)
- カラー(色相と彩度)(Color)
- 輝度(Luminance / Luminosity)
このブレンドモードは、基本的には
HSB カラーモデルを使用していますが、普通の HSB モデルとは異なり、明度(Brightness)ではなく輝度(Luminance)に大きく支配されています。というよりも、明度は無視しています。ですから、これを HSB モデルと呼ぶのは問題があるかもしれません。輝度とは、
Luminance = ( 0.298912 * r + 0.586611 * g + 0.114478 * b );
で計算される明るさの指標です。
HSB の明度は RGB の最大値から算術的に計算されます が、輝度は人間の視覚に合わせた感覚的な指標です。上記の係数では細かすぎるので、それぞれ 0.30、0.59、0.11 程度で充分でしょう。テレビの Y / C 分離や JPEG 内部の YUV でも、同じ理由から輝度を分離して処理します。輝度と色相または彩度だけで色を決めるというのは、お互いが依存しあってるので結構厄介です。
上のレイヤーの色相で下のレイヤーを着色しますが、下のレイヤーの輝度を維持します。つまり、上のレイヤーの彩度や明度は一切維持されませんので要注意です。
ちょっと計算式を上手くまとめられなのですが、ルールは以下の通りです。
上のレイヤーの色相を Hb、下のレイヤーの輝度を La 、結果色の色相を Hn、下のレイヤーの RGB の最小値と最大値の差を Ca とすると、最終的に合成される RGB 値は、以下の2式
Hn = Hb
La = (0.30 * r + 0.59 * g * 0.11* b)
を満たす r、g、b の組み合わせのうち、その最大値と最小値の差( Cn とする)が Ca と等しいものである。ただし、Ca が Cn の最大値より大きい場合は、Cn が最大になるものとする。
例を出すと、
204 110 51 ■
に
65 188 106 ■
を色相で重ねる場合、
La = 0.30 * 204 + 110 * 0.59 + 0.11 * 51 = 132
Hb = Hn = 140
を満たす組み合わせは、
131 133 132 ■
130 133 131 ■
128 135 131 ■
<中略>
12 204 76 ■
8 207 74 ■
6 207 73 ■
4 209 72 ■
0 212 71 ■
など多数あるが、
Ca=153
なので、Cn=153 となるような
36 189 87 ■
が結果となる。
ルールとしては上記の通りなのですが、この考え方で実装したら、たかだかブレンドの表示のためにループか再帰が必要になるのでちょっとヤバそうです。YCrCb で考えても結局同じだと思うし……。うーん実際にはどうやってんだろう。私が式を思いつけてないだけだと思うんですが。
調整レイヤーで色補正するよりも、このように色相レイヤーで補正することをお勧めします。
これも下のレイヤーの輝度を維持しようとするので、上のレイヤーの彩度は完全には維持されません。正確に書くと、上のレイヤーの色相と輝度を下のレイヤーのものに置き換えます。
ルールは以下の通り。
下のレイヤーの色相を Ha、下のレイヤーの輝度を La 、結果色の色相を Hn、上のレイヤーの RGB の最小値と最大値の差を Cb とすると、最終的に合成される RGB 値は、以下の2式
Hn = Ha
La = (0.30 * r + 0.59 * g * 0.11* b)
を満たす r、g、b の組み合わせのうち、その最大値と最小値の差( Cn とする)が Cb と等しいものである。ただし、Cb が Cn の最大値より大きい場合は、Cn が最大になるものとする。
彩度による塗り斑も結構面白い効果があるかと。
これも、ヘルプの記述はやや不正確です。上のレイヤーの色相は維持されますが、彩度は輝度によって変化します。元画像の輝度が飛んでしまうので、ベタ塗りのレイヤーで色調を統一するためだけなら、これを使わずに彩度モードを使いましょう。逆にいえば、輝度を飛ばして均すことができます。
ルールは以下の通り。
上のレイヤーの色相を Hb、下のレイヤーの輝度を La 、結果色の色相を Hn 、上のレイヤーの RGB の最小値と最大値の差を Cb とすると、最終的に合成される RGB 値は、以下の2式
Hn = Hb
La = (0.30 * r + 0.59 * g * 0.11* b)
を満たす r、g、b の組み合わせのうち、その最大値と最小値の差( Cn とする)が Cb になるものである。
これは彩度モードでも同じことですが、白や黒の無彩色の色を乗せると、グレースケール化することができます。輝度を維持したまま下のレイヤーの彩度を落とすなどの際に使えると思います。
上のレイヤーの輝度で下のレイヤーを均します。輝度を均すと画像のイメージが大幅に変わるので要注意です。
下のレイヤーの色相を Ha、下のレイヤーの輝度を La 、結果色の色相を Hn、下のレイヤーの RGB の最小値と最大値の差を Ca とすると、最終的に合成される RGB 値は、以下の2式
Hn = Ha
La = (0.30 * r + 0.59 * g * 0.11* b)
を満たす r、g、b の組み合わせのうち、その最大値と最小値の差( Cn とする)が Ca と等しいものである。
これはなかなか使い道思いつきませんねー……。輝度は画像の一番重要な情報なので均すわけにはいかないし。わざわざ輝度を潰さねばならんシチュエーションって何だろ。
幾つか思いつく注意点だけをまとめておきます。
- レイヤーモードでやるよりは、画像をコピーして調整して通常モードで重ねた方が応用が効くことも多いので、無理にレイヤーモードを使わない方が生産性上がるかも。
- RGB モードのブレンドの一部には、直感的な予想と結果とが異なるケースがあるが、諦めて慣れるしかない。
- 全体の色を調整する場合は、調整レイヤーの 色相・彩度 ではなく、色相モードのレイヤーを使う方が、輝度が維持されるのでお勧めである。
Author : Mishiki Sakana
<osakana@ofo.jp>
Last Modified :
Fri, 29 Sep 2006 08:57:28 JST (+0900)
Published : Fri, 02 Nov 2001 JST (+0900)