2017年9月26日

赤と緑を混ぜると何色? デジタルの「色」の基本


Youtubeで公開されている色についての動画を翻訳…



Youtubeでデジタル画像処理の色に関する面白そうな動画があったので試しに翻訳。基本的な内容ですが、たとえばUnityでもカラースペースを変更したり画像をブレンドしたりするときに必須となる前提知識だと思います。minutephysicsのチャンネルでは他にも興味深い動画が多数公開されています。


Computer Color is Broken
PhotoshopやInstagramなどでカラフルな画像を表示し、その画像をぼかしてみると、隣り合う明るい色どうしの境目に不自然な暗い境界線が現れます。


うへぇ!きたねえ!

現実世界では、ぼやけた色どうしは赤→黄色→緑のようになめらかに変化しながら混ざり合っていて、決して赤→茶色→緑なんていう変化にはなりませんよね!

こういう色の混ざり方の問題というのは、デジタル写真をぼかすときだけに発生するものではありません。コンピュータが画像をぼやかす時や半透明の縁取りを使用する時には、必ずと言っていいほどこの酷い「汚れ」が現れます。

この汚れが現れる原理や、この汚れを取り除く方法はとっても単純です。

まずは、人間が明るさをどう認識しているか、というところから始めましょう。


人間の視覚は、聴覚同様、対数の尺度で機能しています。これはつまり、ライトの数を1個から2個に増やした場合、ライトを101個から102個に増やしたときとは比べ物にならないほど受け取る明るさが増えてしまう、ということなのです。実際にはどちらもライトを1つ増やしたことには変わりないのに、です。

われわれ人間の目や脳というのは、暗い画面では少しの色の違いにも気づきやすいのですが、明るい画面では色を見分けづらいようにできています。

一方、コンピュータやデジタルイメージセンサなどは、単純に光センサーに当たった光子(フォトン)の数に基づいて明るさを判定します。したがって、光子の数が増えれば、周囲の明るさに関係なく、その分だけ検知される明るさも大きくなることになります。

デジタル画像が保存されるとき、コンピュータは画像の各点で赤緑青(RGB)それぞれの色の明るさの値を記録します。

通常、0は明るさゼロ、1は明るさ100%を表します。


ということは0.5は1の半分の明るさ…のはずですよね?

いえいえ、実は違います。

確かにわれわれの目にはこの色は黒と白の中間の色に見えますが、それは人間の視覚が対数の尺度になっているためです。実際の物理的な明るさでいえば、光子の数は完全な白のたった1/5しかないのです。

さらにビックリなのは、0.25の明るさの画像の場合、光子の数が白の1/12しかないということです!

デジタル画像処理においてこのような「実際の数値よりも暗めに表示する」方式がとられているのも当然でしょう。思い出してください、人間の視覚は暗い画面のほうが色の差を認識しやすいのです。

画像処理の黎明期、ソフトウェアのエンジニアたちはこのことを利用して容量を削減していました。


仕組みは単純です。デジタルカメラで物体を写したとき、明るさの値をそのまま保存するのではなく、平方根の値を保存するのです。こうすれば暗い色にはより多くのデータ点があてられ、明るい色には少ないデータ点を用意するだけで済みます。おおまかに人間の視覚の性質をマネたわけですね。

そして画像をモニターに表示する必要がある場合には、きちんと色が表示されるよう明るさの値を二乗してもとに戻せばいいのです。

これで問題は解決したように見えますが、画像ファイルを修正しようとした場合には話が別です。

たとえば「ぼかし」の処理は、各ピクセルを、隣り合う色の平均で置きかえることで実現されています。簡単ですね。


しかし、平均を算出する「前」に平方根にするのか、平均を出した「後」に平方根にするのかで結果が変わってしまうのです!

そして残念ながら大多数のソフトウェアがこの処理をミスっています。

たとえば、赤と緑の境界線にぼかしをかけたい場合、中央部分の色は半分赤で半分緑であるはずだ、と思いますよね?

ほとんどのコンピュータは、何も考えず画像ファイルの明るさの値からそのまま平均を出そうとします。カメラ側でデータ容量を削減するため、実際の明るさが平方根に変換されていることを忘れてしまっているのです!

「2つの平方根の平均」は「平均した値の平方根」よりも常に小さくなるわけですから、その結果、平均した値は暗すぎる色になってしまうわけです。

赤色と緑色を正しく混ぜ合わせ、暗い「汚れ」を回避するためには、まず最初に各色の明るさを二乗してカメラ側の処理をもとに戻し、それから各値の平均を算出し、さらにその後で平方根に戻す、という処理をしなければならないのです!


ほら、だいぶ良くなったでしょ? ちゃんと黄色になっています。

残念ながら、iOSからInstagram、Adobe Photoshopの標準設定に至るまで、大多数のソフトウェアが画像の明るさに対して、この手抜きで汚い誤ったアプローチをとっています。

たしかに、Photoshopをはじめとするプロ用の画像処理ソフトには、数学的かつ物理的に正しい色の混ぜ合わせを行うための詳細設定も用意されてはいます。

でも、その美しいほうこそ標準設定にするべきではないでしょうか?

おしまい。翻訳ミスとかがあっても大目に見てちょんまげ…

とにかく重要なポイントは「人間は暗い色のほうが敏感に差を感じ取れる」ということと、そのために「デジタル画像では実際の(光子の数を基準とした)明るさよりも暗い色に変換されている」ということですかね。動画内では「二乗⇔平方根」で変換すると説明されていますが、たぶんこれ一般的な(NTSC方式の)ガンマ値であれば「2.2乗⇔1/2.2乗」という変換になる…っていうことだと思います。たぶん。実は全然違う話だったらごめんなちゃい。

0 件のコメント:

コメントを投稿