|
RGB、CMYの不思議
光の三原色を全て集めると白くなり、絵の具の三原色は黒くなるのだと学校で教わったときには、なにか納得できないような気持のまま、光は透き徹っているから白で、絵の具は濁っているから黒くなるのだと勝手な解釈をしていました。こういった解釈の方法は子供の頃よくやっていて、月は満ちてくるにしたがって重くなるから、少しずつ月の出が遅くなるんだと思っていたり、地球儀を回しながら、南極はあまり動かないから寒いんだなと妙に納得してみたり、まあそれなりに合理性がないこともないのですが(笑)、でも、大人になった今、さすがにこれでは済まされません。カラーチャートを作った折でもありますので、色についていろいろ考えてみました。 RGBは Red Green Blue の光の三原色、CMYは Cyan Magenta Yellow で、絵具の三原色です。 パソコンではRGBそれぞれを256通り(8bit)の強さで表して、256×256×256=16,777,216 通りの色を表現することが出来ます。これは2の24乗ということで24ビットカラーと呼ばれることがあります。 ここでは、各1ビット ( all or nothing ) にして、3ビット(2の3乗=8色)で表してみます。
各々は、青 + 緑 = シアン (001+010=011)、青 + 赤 = マジェンタ (001+100=101)、赤 + 緑 = 黄色 (100+010=110) などのように足し算をすることができます。このようにRGB3色のうちの2色を足し合わせたものがCMYという関係になっています。3色を全部足すと白(111)になり、全てが無であれば黒(000)です。ここまではすんなり分るのですが、それでは、シアン + マジェンタ (011+101) や、黄色 + 黄色 (110+110) はどうなるんでしょうか。 おとなの方は途中を飛ばして、解決篇からお読みください。→ 解決篇 もし、011+101=110、110+110=000 のようにになってくれれば、光の色と絵具の色の白黒問題は解決に向かいます。これは「排他的論理和」による計算です。
そうはいきませんでした。水色+紫=黄色、黄色+黄色=黒などとはまた突拍子もないことを考えるものです。その突拍子もない空想を図にしてみました。図にして呆れました。こんなことが現実にある訳がないです。未知の関係を解き明かしたような気持に一瞬なったのですが、そうではなかったみたいです。色の足し算は「論理和」で計算すべきでした。 実際は、水色+紫=白(011+101=111)、黄色+黄色=黄色(110+110=110)です。 赤+緑=黄色を例に、この論理和を模式図にするとこんな感じです。 黄色い光線を輪切りにした図と思ってください。
ところで、RとC (100 & 011)、GとM (010 & 101)、BとY (001 & 110)のように並べてみて、うまい具合に凹凸関係になっていることに気がつきました。お互いに埋めあえば白(111)になる関係、一方を眺めた後に目をつぶるともう一方の色が見えてくる、補色の関係です。 |
|
続・RGB、CMYの不思議
また一からやり直しです。こんどはもっと根本的なところ、わたしたちが物を見るとき何を見ているのかというところから考えてみました。
物自体は光がないと見えません。では、わたしたちは光を見ているのでしょうか。もし光が見えるとするならば、空気中を透過していく光も見えなければならないことになります。光は見えないのです。光も見えない、物そのものも見えない、では何が見えているのか。見えているのは光が物に当たるときに起こる化学反応なのです。光は網膜を照らすときにも化学反応を起こします。物と光の相互作用的な現象を私たちは見ているのです。 表面上、これは光の反射吸収と考えることも出来るのですが、そうなると吸収された光はその後どうなっていくのかという問題が残ります。吸収された光は蓄えられて、物の内部は光に満ち溢れているのだと考えるのも、たしかに楽しいことではあるのですが、光を吸収しすぎて麦藁帽子が暴走したなどという話は聞いたことがありません。やはり光は反応に費やされているのです。 マッチの炎や太陽などの光源もやはり酸化反応や核融合反応として光を発しているわけで、私たちに見えるのは光そのものではなく、その現象なのです。 何となく先が見えてきました。光の色と絵具の色は異質なんですね。この質の異なる二つのものが反応しあうことによって初めてわたしたちは物を見ることができるのです。
もういちど図を作ってみました。こんどは間違っていないはずです。光の色は「白い」スクリーンに投影されたときの色であり、絵具の色は「白光」に照らされたときの色、と言うことになります。それでは、光の3原色を合わせると白くなるのに、なぜ絵具の3原色は黒くなるのかという最初の問題に戻ります。 光の3原色は、地球に届く太陽光を分解したものだろうから、それを元に戻せば太陽光の白(無色)になるだろうということはだいたい見当がつきます。でも絵具の3原色については謎です。これも元の色を分解したのだとすると、元来地球は真っ黒だったということになってしまいます。ふむ、ひょっとしたらそうかもしれない。 今、太陽の光を「白(無色)」と書きました。光源を見るときには白色に見えますが、スクリーンに投影されると無色であり、絵具の赤を照らせば赤く見えるし青を照らせば青く見えるということです。 しかし光の量を増していって、絵具の色の反応を超える光で照らしたら、どんなものでも真っ白になってしまいます。逆に白色光(111)でも光の量が少なければ、黒(000)と言っても構わないようになります。 白(111)と黒(000)は違いは、単に光の量の違いだったのです。 一方の絵具の白も、絵具を塗らない状態ですから、これも無色です。画用紙の地の色が白であれば白(000)は白色ですが、画用紙が黒ければ白(000)も黒ということになります。 ここで、黒い画用紙に白い模様を描くにはどうすればいいのかを考えてみたいと思います。白い絵具などはありません。あるのはCMYの3色だけです。白と黒は量の違いに過ぎないのですから、CMYを足し合わせて出来た黒を、とにかく重ねて塗っていけばいい訳です。とにかく量が問題なのですから、絵具を惜しまずどんどんどんどん塗っていって、諦めずにさらにどんどんどんどん塗っていけば、いつかは白く輝くはずです。 結論です。絵具の3原色を足し合わせて黒くなったのは、単に絵具の量が少ないからなのでした。絵具を惜しんだのがいけなかった。 めでたし
おとなになったと思っていたけど、わたし、まだまだ子供でした。 |
|
RGB、CMYの不思議 解決篇 (現実を生きるおとなの人のために)
このままではカラーチャートの信用まで落としてしまいそうですので、勉強いたしました(笑)。
写真のポジフィルムとネガフィルムもRGBとCMYの違いなんですね。 ネガとポジであれば相互に変換可能な関係です。逆立ちして裏返って後ろ向きに鏡を覗き込んだら普通に見えた、みたいなことなんですね。ほんとか(笑)。 それはともかくとして、CMYによる合成はRGBのネガのような合成法だったのです。 ◆ 加算法(RGB)と、減算法(CMY) RGBとCMYの違いを模式的に見ると、RGBがそれぞれ色のついた3本の光源であるのに対して、CMYは1本の白色光源の前に重ねられた3枚のフィルタだと言えます。要素を積み重ねて全体に至るのか、全体を分解して要素を導き出すのか、という違いです。 ここでも3ビット8色の環境をモデルとして考えていきます。24ビットの場合、加算法では光の強さがRGBそれぞれに256通りあり、減算法ではフィルタの濃さがCMYそれぞれに256通りあると考えてください。 加算法は、RGB3色の懐中電灯をスクリーン上の一点に照射するイメージです。RGBの順に点灯していけば、スクリーンに映し出される光は赤、黄、白と変化していきます。点灯している懐中電灯の数が増えればその分明るさも増大します。 これに対し、減算法は光源を1つだけ使って、白色光を分解していくやり方です。加算法では光を3分の1ずつ足していきましたが、こんどは3分の1ずつ引くことになります。もしここで赤いフィルタを使ったとしたらどうでしょうか。赤いフィルタは赤を透過させるために青と緑を遮断しますので、一挙に3分の2を引くことになってしまい、8色環境ではもうこれ以上の色を作ることは出来ません。光を分解していく作業では、合成の単位であるRGBは最終目標値となるのです。(註1) ここではRGBのうち1色だけを引くようにしなければなりません。赤を引くとしたら、青と緑を透過させるのですから、シアン(青+緑)のフィルタにすればいいのです。同様に緑を引くならマジェンタ、青を引くならイエローです。減算法の3原色CMYはそれぞれ補色の関係にあるRGBを遮断するフィルタなのです。 それでは減算法で色の合成をやってみましょう。まず黄色いフィルタを掛けてみます。当然黄色く見えますが、これは青を減算した色で赤と緑の要素を持っています。ここにマジェンタを重ねると、これは緑を減算するフィルタですから赤だけが残ることになります。黄色+マジェンタ=赤です。さらにシアンを重ねると、これは赤を減算するフィルタですから、もう透過できる光はありません。黄色+マジェンタ+シアン=黒です。 おお、みごとに黒になりました。フィルタは決して濁ってもいませんし、無数に重ね合わせたわけでもありません(笑)。(註2) 以上、光の色として考えてきましたが、絵具の色もこのフィルタと同じ働きをすると考えられます。反射吸収説には賛成できないものの、とりあえず、黄色の絵具は青を吸収して赤と緑を反射するフィルタです。 ◇ 註2:懐中電灯を例にとりながらもこれは理論的なお話ですから、遮断すべき色は100%遮断し、透過させるべき色は100%透過させる理想のフィルタを使っています。ですから、同じ色のフィルタは1枚も100億枚もまったくの同値です。無数に重ね合わせたからと言って、色や明るさに変化が生じることはありません。 ◇ 註1:同様に、赤いフィルタに赤やイエロー、マジェンタのフィルタをどれだけ重ね合わせても出力される赤に変化は起こりません。それ以外のフィルタを重ねるとまったく光を通さなくなります。 |
|
◆ 色の合成と演算 ![]() 右の図では、統一的に色の関係が分るようにCMYもRGB値で表しています。 減算法の図は色の包含関係を表現するベン図にもなっています。重なり合っているところは両者の共通部分です。全てに共通する要素である中心部分は空(Φ)であり、黒(000)ということになります。 加算法の図はそれを裏返して見ているようなもので、要素(RGB)を集めて全体(白)を形作っている図と言えるでしょう。減算法の図の中心の黒い領域からベン図の中に入り込んで、中心から外側を振り返って見ているわけです。 そうやって見ると、減算法の合成が論理積であるのに対して、加算法の合成は論理和で表されているのが分ります。減算法の合成は「黄色∩マジェンタ=赤」であり、加算法の合成は「赤∪緑=黄色」です。 CMYはRGBの否定値ですから、論理積=否定の論理和の否定という関係になります。同じようにRGBはCMYの否定値ですから、論理和=否定の論理積の否定という関係になるわけです。 ![]() ちょっとややこしくなりますが、右図のようにCMYを主体にした値で考える場合、これはそれぞれ遮断する色のRGB値となっています。透過する色にとっては補色の値であり、否定値ですから、 「黄色(110) ∩ マジェンタ(101) = 赤(100)」という論理積が 「黄色の否定(001) ∪ マジェンタの否定(010) = 赤の否定(011)」のように遮断の論理和で表されることになります。 更にややこしくなりますが(笑)、もう少し一般化すると次のようになります。 ( 赤と緑の論理和 )=(( 赤の否定と緑の否定 )の論理積 )の否定 ( 黄色とマジェンタの論理積 )=(( 黄色の否定とマジェンタの否定 )の論理和 )の否定 遥か昔に学校で教わったような関係式がこんなところにまで現れてきました。 論理積は積集合(交わり)、論理和は和集合(結び)を指します。否定は補集合であり、補数であり、この場合は補色になっています。 |
|
2色合成の演算
16 進数 6 桁で入力、または色の領域をクリック
水平位置で 00~ff を決定し、垂直位置によって RGBの要素を決定
|
||||||||||||||||||||||||||||
HSVの不思議
色相は60度ごとに 赤(ff0000) 黄(ffff00) 緑(00ff00) シアン(00ffff) 青(0000ff) マジェンタ(ff00ff) と並んでいます。 上の色相円環の図は30度ずれています。ごめんなさい。 SとVの値が 100% のとき、 Hの位相が 300~60度(上図で330~90)まで、 赤の値は ff です。 0 度に向けて青が低下し、60 度に向けて緑が上昇します。 60~180度までは 緑の値が ff で、 120 度に向けて赤が低下し、180 度に向けて青が上昇します。 180~300度までは 青の値が ff で、 240 度に向けて緑が低下し、300 度に向けて赤が上昇します。 円の中心に向かってSの値が下がるとRGB値の 00 が ff に向かい、また、Vの値が下がると ff が 00 に向かい、ともにRGB値の幅は狭まることになります。 下の「HSV、RGB変換」で、SとVを 100、Hを 300 にして、Hの+5ボタンを連続して押してみてください。HSVとRGBの関係がよくわかると思います。
数値入力後、Tab キーを押してボタンを選択すれば、Enter キーで連続できます。
HSV、RGB変換
Hは角度(0~360)、SとVは百分率値(0~100)とし、小数点以下も有効。
RGBは16進数 2桁で入力。色彩スライダー、または数値横のボタンをクリック。 変換は60度ごとに分けて考えます。 Hの値が0~60度の場合です。まずSとVの値を100として、RGB値を百分率で表すと、 R=100、 G=(60度までの角度割合)*100、 B=0、です。 ここにSの値を加味すると、 R=100、 G=100-S*(60度から0度に向かう角度割合)、 B=100-S、です。 更にVの割合を掛けます。v=V/100とすると、 R=100*v、 G=(100-S*(60度から0度に向かう角度割合))*v、 B=(100-S)*v、 これを0~255に投影するとRGB値(24bit)になります。 60度から120度、120度から180度と、同じような発想で(ちょっと違う)処理を繰り返しますが、以下省略します。 なお、変換についてはこちらで公開されている方法に拠りました。 |