HN🔥 44
💬 18

エンジニアなら知っておきたい!ガンマ補正の基本と重要性

sph
3日前

ディスカッション (10件)

0
sphOP
👍443日前

ガンマ補正は、デジタル画像における明度や輝度を人間の視覚特性に合わせて最適化するための非常に重要な技術です。多くのエンジニアが「なんとなく」理解しがちなこのテーマについて、なぜモニター上で見た色が意図通りに出ないのか、また画像処理のパイプラインにおいてなぜガンマエンコードとデコードが不可欠なのか、その仕組みを深掘りして解説します。

1
LoganDark
約20時間前

RGB値(128, 128, 128)のピクセルは、RGB値(255, 255, 255)のピクセルの約半分の光を放出する。

厳密に言うと、これは常に間違いというわけじゃない。作業用の色空間がリニアで、0が「光なし」を意味するならね。問題になるのは、sRGBや非線形な色空間(あるいは0が「光なし」を意味しない空間)を想定しているルーチンやサーフェスに、同じデータを渡してしまった時だけだよ。

2
dheera
約20時間前

どの画像の方がグラデーションが均一に見える?2番目だよ!

俺は1番目の方が均一に見えたな。1番目なら隣り合うバーの間の違いが全部わかったけど、2番目だと最初の4〜5本の間には全く違いがわからなかったよ。

3
zokier
約20時間前

画像処理においてsRGBをリニア化するのはあくまで中途半端な対策でしかないし、いっそもっと優れた色空間を採用したほうがいいかもね。CIELABが典型例だし、Oklab、JzAzBz、XYBとか、他にもいろいろあるし。

4
nicebyte
約18時間前

ガンマ補正そのものについて「不可解」な点なんてほとんどないよ(数学的には本当に単純だからね)。

根本的なレベルで言えば、電球1つの光にさらされている面に別の電球を足したら、その違いは人間の目には極めてはっきりとわかる。でも、すでに電球が100個ある面にさらに1つ足しても、視覚的な違いは全く感じられない。この反応は、かなりシンプルなべき乗則(記事で言及されているような低輝度域での修正付き)でモデル化できるんだ。

「ガンマ補正」なんて結局はそれだけの話。これは、人間の視覚システムのクセを悪用して、さまざまな「明るさ」の値をエンコードするためのビットを効率的に割り振るためのハックに過ぎないんだよ。

混乱やバグの原因のほとんどは、最終的な画像を作り上げる一連のシステムのどこかが、他のシステムが何をしているかについて誤った前提を持っていることに由来する。その点では座標空間の扱いに似てるね。

5
shaggie76
約18時間前

ICCプロファイルも同じような問題を引き起こすよ。驚くべきことに、画像共有サイトを自称するInstagramでさえ、画像をスケーリングする時にプロファイルを無視しちゃうんだ(少なくとも数年前にPCから投稿し始めた頃はそうだった)。フル解像度の一眼レフのオリジナルをアップロードすると、肌の色調がめちゃくちゃになってた。最終的な解像度に合わせてエクスポートしてから上げれば、同じICCプロファイルでも問題なかったんだけどね。

6
blt
約18時間前

なんでデシベルスケールみたいに指数ベースのものを使わず、多項式ベースのものを使ってるんだろうね?

7
hatthew
約17時間前

これってガンマの問題というよりは、色空間やモニターのキャリブレーションの問題のような気がする。この記事が書かれた当時はOklabが存在しなかったし、色空間への一般的な認知度が低かったことも影響してるのかも。

8
20k
約17時間前

この記事、かなり重大な間違いが含まれていて正直びっくりした!

物理的に線形な輝度データを(アルゴリズムで生成したり、デジタルカメラのCMOSやスキャナーなどのリニアデバイスでキャプチャして)、知覚的に線形なスケールの離散値で表現する変換をガンマエンコーディングと呼ぶ。

これ、あまり正確じゃない。この記事の一番の問題点を浮き彫りにしてるね。

sRGB(とそのガンマエンコーディング関数)は、知覚的な線形性とは一切関係ない。sRGBは知覚的に線形じゃないんだ!もともとのガンマエンコーディングは、昔のCRTの非線形な伝達関数を補正するために作られたものだと認識してる。人間の視覚が非線形なのは確かだけど、sRGBは人間の視覚の知覚的線形性と特にうまく適合するわけじゃない。これもよくある間違いで、もしsRGBが知覚的に線形だから作られたなら、なぜ色を混ぜるのにsRGBを使っちゃいけないんだ?という疑問に繋がってしまうんだよ。

記事はその誤解をさらに深めてしまっていて、それがこの問題をこじらせている原因だよ。

興味深いことに、Photoshopはデフォルトでγ=1.42を使用してテキストのアンチエイリアス処理を行っており、これが(中央の画像のように)最も見栄えの良い結果をもたらすようだ。これは、ほとんどのフォントがガンマ非対応のフォントラスタライザ用に設計されているためで、もし(正しく)リニア空間を使えば、フォントは本来よりも細く見えてしまうからだ。

ここで間違いが積み重なっていくんだ。

アンチエイリアスで何を目指すべきか考えてみて。線をラスタライズする時、ピクセルが40%だけカバーされていると判断して暗くしたいとする。つまり、そのピクセルを「人間に対して」40%の明るさで表示したいということだ。40%の光を放出すればいいわけじゃない。だって、アンチエイリアスはそういう目的じゃないからね!

sRGBもリニアカラーも、どちらも使うべき色空間じゃない。知覚的に線形な色空間でブレンドしたいところだけど、Photoshopの1.42というガンマ指数は、LUV変換より低コストなまま、おそらく2.2や1.0よりも人間の視覚によく適合してるんだろうね。

コンピュータのディスプレイシステムで使われる標準的なガンマ値(γ)は2.2である。その主な理由は、ガンマ2.2が人間の視覚のべき乗則的な感度におおよそ一致するためだ。

ガンマ伝達関数についての説明も間違ってる。ハードウェアアクセラレーションによるsRGB変換が一般的で、正しく処理するのがタダ同然のこの時代に、ここをしっかり理解しておくのは価値があることだよ。

9
dmitshur
約16時間前

要約すると、デジタル画像にガンマエンコーディングを使う唯一の理由は、ビット長が限られた環境で画像をより効率的に保存できるからだ。

uint8じゃなくて(HDRでよくある)float16エンコードされたカラーコンポーネントを使う場合、このトレードオフがどう変わるのか興味深いね。

Safari 27でsrgb-linearやdisplay-p3-linear色空間のサポートが追加されたのはいいタイミングだね。