このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
今日はガンマ値の調整。
これも画像を扱うアプリケーションの定番機能でもある。
ガンマ値は、画像自体が持つ特性ではなく、
画像を表示するハードウェアの特性である。
ピクセル値、つまり入力値が、0 から 255 まで
直線的に滑らかに変化しても、
ハードウェアの表示、つまり出力値は、
同じように滑らかに出力するとは限らず、
ハードウェアによって様々である。
このハードウェアによって異なる、
入力と出力の相関関係を示すのがガンマ値であり、
出力レベルは、入力レベルのガンマ値乗で計算される。
ガンマ値が 1 であれば、入力=出力となる。
例えば、CRT は、ガンマ値が 2 前後と言われているが、
ガンマ値が 2 である CRT があるとすると、
入力が 0.5 の場合、出力は、0.5 の 2 条で、0.25 となる。
8 ビット値に換算すると、128 の値が、大体 64 程度となる。
実際は、モニタドライバが機器のガンマ値に基づいて
ある程度修正を行っているので、
表示上で上記のような顕著な現象が起こることはないが、
あるハードウェアで作成された画像を、
ガンマ値が異なる別のハードウェアで表示する場合など、
ガンマ値を考慮した調整が必要となる場合もある。
では、ガンマ値の計算式を考えてみよう。
この計算もピクセル内で完結している。
計算前のピクセルの RGB 値を、Rs, Gs, Bs、
計算後のピクセルの RGB 値を、Rd, Gd, Bd とし、
ガンマ値を G とすると、以下の計算で求まる。
Rd = adjust((Rs / 255) ^ (1 / G) * 255)
Gd = adjust((Gs / 255) ^ (1 / G) * 255)
Bd = adjust((Bs / 255) ^ (1 / G) * 255)
ユーザは、適用したい機器のガンマ値を入力する。
例えば、ユーザがガンマ値 2 を指定した場合、
中間ピクセルが暗めになる機器向けということだ、
なので、それに対応してアプリケーション側は、
逆に中間ピクセルを明るく調整するということになる。
つまり、逆数を使って計算する必要がある。