「オートストレッチ」プロセスの詳細
では、オートストレッチが何をしているかの説明に入りましょう。通常のカラー合成処理では、RGBの各画像を、露出倍数で補正(乗算)しますが、オートストレッチではその前にまず画像をストレッチしてノーマライズします。RGBの各画像の明るさは露出時間はもちろんのこと、撮影した条件によっても微妙に変化しています。それらをひっくるめて同じ状態にすることができたら、その後の露出倍数補正が正確に行えるようになります。しかしここで難しいのはノーマライズコンポジットと同じように最小・最大値でノーマライズというわけにはいかないことです。それが通用するのは、RGBが同じ比率、つまり白が最大輝度として存在している画像に限られます。
では何を基準にノーマライズを行えば良いか? 僕はこれに標準偏差を使いました。「ほとんどの対象は、RGBの各画像において、標準偏差は同じになるのではないか?」という仮説を立てたのです。標準偏差とは、画像のヒストグラムの平均値からの広がり具合を示していますが、いろいろな対象でこの値が同じになるようにノーマライズしてみたところ、たいへん良い結果が得られました。
なお、オートストレッチは原理的に、単色で構成された画像には適していません。画面一杯の赤い星雲とか青い星雲などではうまく働かない可能性があることに注意してください。
オートストレッチの概念図
この図は画像のヒストグラムです。天体画像のヒストグラムは、最小値と平均値がきわめて接近していますが、このグラフでは原理をわかりやすく説明するために、左右対称の分布として表現しています。上のグラフは処理前の画像で、最小値が合っていないのでバックグラウンドに色がついている状態です。オートストレッチはヒストグラムの最小値を合わせ、その広がり(標準偏差による幅)を合わせてからフィルターの露出倍数でストレッチします。
オートストレッチの論理式
「オートストレッチ」処理を具体的に式で示しておきます。ピクセル値からまずバックグラウンドの明るさを引き、一番大きな標準偏差の色を基準にノーマライズ、さらに露出倍数(=フィルター係数)をかけます。最後のOffsetは、最小値が黒になると後の処理がやりづらいので、指定した値だけ画像をもち上げることができるようにしました。
僕はこのプロセスを開発するまで、みなさんと同じように通常の露出倍数補正を行っていました。しかしうまくいく時もあれば、失敗しておかしな色になる時もありました。おそらくそれは撮影条件の違いが最終的なカラー画像に影響を及ぼしていたのではないかと思います。オートストレッチプロセスは、このような画像のバラツキを安定させます。露出時間が違う画像であっても自動的に補正されるという嬉しい副作用も生まれました。
また、ストレッチするのと同時にバックグラウンドのRGB値を数値的に正確に合わせます。ここで問題になるのは、画像のどの部分がバックグラウンドなのかということです。先ほど言及した背景ムラという問題もあり、これをプログラムで特定することはひじょうに難しいので、オートストレッチ処理ではユーザーが指定するようにしています。バックグラウンドだと思われる場所をマウスで指定してください。点ではなくエリアで指定するようにしたのは、ノイズなどによる影響を受けにくくするためです。さらに、ステライメージへの実装にあたり、ある一定以上の輝度を持つピクセル値は除外するようにしてもらいました。つまり指定したエリア内に星があったとしても、それは無視されますので、安心して領域を選択してください。ここで指定したエリアが(エリア内に輝度差がある場合はその中間値の明るさが)完全に黒になります。バックグラウンドの取り方で全体のイメージが変わりますから、気に入るまでやり直してください。
ノーマライズされてバックグラウンドも黒になった後に行われるのが露出倍数の乗算。オートストレッチプロセスでユーザーが決めなければならない一番大切な数値です。正確な露出倍数をどのように決めていくかは次回に説明しますが、とりあえず全ての値を1にすると露出倍数補正が行われなくなりますので、標準偏差によるノーマライズの変化を見ることができます。プレビューボタンのON/OFFで効果を確認してみてください。このプレビュー機能がオリジナルアプリ“AutoStretch”から大幅に進歩した部分です。プレビューのチェックボックスをONにしておくと、全てのパラメーターの変更に対して画像がリアルタイムに変化するのでとても便利です。