昨年、ImageJ 上で sRGB (ならびにREC709) 式の知覚的なトーン再生カーブ (TRC) を掛けたり外したりするプラグインスクリプトを作成しました。
ただこのプラグイン、通常の TRC のかかった画像をデコードしてリニア画像に直すのは良いのですが、リニア画像に TRC をエンコードする際にちょっと手抜きがありました。
リニア画像に対して sRGB 式の知覚的 TRC をエンコード / デコードするには以下のような計算を行います。
エンコードの場合、元の画像の値が、ブラックポイントを 0.0 ホワイトポイントを 1.0 の 0.0 ~ 1.0 の範囲を取るとした場合、0.0 から 0.0031308 の範囲では元の値を 12.92 倍し、それより値の高い場合は、元の値に 1/2.4乗して (ガンマ 2.4)、そこで得られた値を 1.055 を乗じて、そこから 0.055 を引きます。
デコードするときは逆に、0.0031308 を 12.92 倍した 0.04045 で分割し、それ以下の値については、12.92 で除するとともに、それを超える値は、一旦 0.055 を加え、さらに 1.055 で割り、さらにその値を 2.4 乗 (ガンマ 1/2.4) します。
デコードでは問題がないのですが、エンコードの場合 v を元の明るさの値とすると、(v ^ (1/2.4) * 1.055) としたときに、1.055 を掛けた時に ImageJ の ImageProcessor の限界値を超える可能性があります(8bit, 16bit 画像の場合)。そこから 0.055 を引くと、ホワイトポイントに近いハイライトデータがクリップされる可能性があります。
前のバージョンはこのハイライト部分のクリップをそのままにしていたのですが (ハイライト部分なので視覚的に鈍感ですので、まぁいいか、ということで)、今回まじめにクリップされないよう取り組みました。なお 32bit 画像では正しく動作しない可能性があります。
簡単かと思っていたら、ちょっと予想外のところで引っかかってしまい、改修に結構時間がかかってしまいました。これについてはまた別稿として記事にしたいと思います。
使い方は前のバージョンと変わりませんので、マニュアル的なところは上の前バージョンの記事をご参照ください。
ダウンロードはこちらから。
実行例をお見せします。まず TRC がかかっているオリジナル画像から。
TRC デコードを行い、リニア画像を作成します。
リニア化した画像に再度 TRC エンコードを行います。
ヒストグラムを見ると再度元に戻っているのが分かります。