天文はかせ幕下

PIのPixel MathでSIの「ディジタル現像」を真似する

ステライメージ(SI)に実装されている「デジタル現像」処理は,もともとは岡野邦彦氏が考案された手法です。

その詳細はたとえば映像情報メディア学会誌vol.57, No2. pp203 (2003)などに公開されています。当時はまだ,CCDカメラがフィルムに劣っていた時代だったようで,CCDカメラの像を,フィルムカメラの質感に近づける目的で「デジタル現像」が考案されました。そういう意味では,いにしえの手法と呼ぶべきかもしれませんが,その基本的な階調圧縮の考え方は有用であり,現在でもまだ利用している方は多いと思います。

今回は,SIに実装されているデジタル現像を,Pixinsight(PI)のPixcel Mathで「真似する」方法を紹介したいと思います。

デジタル現像の概要

輝度強調

元画像の j 番目のピクセル情報を  X_j ,デジタル現像処理後のj 番目のピクセル情報(RGB値)を  Y_jとします。

 Y_j=\displaystyle\frac{kX_j}{X_j+a}+b~~~~~~(1)

という変換がディジタル現像の基本になります。パラメータa,bは

a値がハイライトで特性線が寝はじめるレベルを決める係数である。b値は脚部が始まるバック濃度を決めている。  映像情報メディア学会誌vol.57, No2. pp203 (2003) より引用。

一方kはハイライト部の強さを調整するパラメータで,通常は k=aと採るようです。

かいつまんで述べますとこの式は,フィルムカメラの現像過程での化学的な非線形現象をモデル化したものと考えることが出来ます。フィルムカメラでは,輝度が飽和に近づくと現像液の不足によって化学反応の効率が落ち,入射光とフィルム輝度の間の線形性が崩れ。自然に飽和が起こりにくくなります。これを(1)式でモデル化しているわけです。

エッジ効果

またフィルムカメラでは輝星の周辺など,輝度に大きな勾配があるところでは,現像液の拡散によって自然に「シャープ化」が行われます。これは,飽和に近づいて現像液が欠乏しているところに,すぐ近くのまだ暗いところで余っている現像液が拡散して,コントラストが上がるためである,と説明されています。その効果を取り入れるために,上の式は

 Y_j=\displaystyle\frac{kX_j}{\tilde{X_j}+a}+b~~~~~~(2)

とする場合もあります。ここで\tilde{X_j}は,元画像に数ピクセルほどのぼかしをかけた画像を意味します。しかし,この方法は顧問が試した範囲ではリンギングが起こりやすく,またシャープ化の方法は他にもたくさんあるので,このエントリでは(1)を使います。

彩度強調

デジタル現像ではまた,色彩強調処理もおこなわれます。これも計算は単純です。元画像のj 番目のピクセルのLRGB値をそれぞれ X_j^L, X_j^R, X_j^G, X_j^Bとすれば,その中から一つを選んで(例えば X_j^Lをつかって)(1)式を

 Y_j=\displaystyle\frac{kX_j}{X_j^L+a}+b~~~~~~(3)

と置き換えるだけです。これでなぜ色彩が強調されるかは上の引用文献を御覧ください。この方法では,RGB 3つの各チャンネルに対して選択的強調処理を作用させることができ,そのやりかたも X_j^L, X_j^R, X_j^G, X_j^Bのどれを選ぶかで4通りあります。SIを使用されたことがある方はおわかりと思いますが,これが色彩強調マスクの謎の3x4マトリクスに対応しています。

Pixinsightで「デジタル現像」を真似する

さて,ここからの内容は,デジタル現像の処理内容について顧問の推測が含まれます。あらためてSIの「デジタル現像」ウインドウを見てみましょう。

f:id:snct-astro:20201014145550p:plain

このように,SIのデジタル現像はレベル調整にプラスアルファする形で実装されています。ですので,上の(1)式をそのまま適用するだけではうまくいきません。

上図のmが暗部側スライダ,n が明部側スライダです。一方で p のスライダがデジタル現像を用いてハイライトの調整を行うものです。下の図を御覧ください。

f:id:snct-astro:20201014145655p:plain
まず,暗部スライダmと明部スライダnを動かすだけの最も単純なレベル調整は図(a)のようなトーンカーブを元画像に適用することを意味します(ここでは中間スライダは考えません)。一方で(1)式は図(b)のようなトーンカーブなります。

ステライメージのデジタル現像はこの2つを組み合わせているようです。顧問は図(c)に赤線でしめしたようなトーンカーブになっているのではないかと予想しました。つまり(b)のカーブを x=aの位置まで平行移動したあと,(x,y)=(a,0)でのカーブの傾きを,レベル調整の傾きと一致させたわけです。それは数式で表すと

 Y_j=\displaystyle\frac{p}{n-m}\frac{X_j-m}{X_j-m+p}~~~~~~(4)

と表されます。また「ガンマ調整」を行う場合は

 Y_j=\displaystyle\frac{p}{n-m}\frac{(X_j-m)^\gamma}{(X_j-m)^\gamma+p}~~~~~~(5)

としますが,ここでは以降\gamma=1として話を進めます。

PixelMathでデジタル現像する手続き

もう結論は出たようなもので、あとはPIのpixelMath機能で上記の(4)式を画像に適用するだけです。その手続きについてまとめておきます。

サンプルとしてASI294MCで撮影したM13の画像を用います。ダーク減算、フラット補正、スタックを終え、カラーバランスを整えた画像に対して、上記の方法を適用してみます。

PixelMathを起動して,次のように数式を入力します。ここで$Tは現在アクティブな画像を指します(後日追記:数式が負の値をとるときは画像は0に、1以上の値をとるときは1に丸められるのでそのへん気にする必要ありません)

f:id:snct-astro:20201014155639p:plain

 m,n,pのパラメータは,"symbols"タブに以下のように入力していますが,ここでn,mがデジタル現像の明部・暗部スライダの輝度の値,pがデジタル現像のハイライト調整値を表します。元画像の背景とハイライト部の輝度値を測定して値を決定しました。pの値は、ハイライトが飽和しないように、nと同じかそれより小さめに取ります。

f:id:snct-astro:20201014155737p:plain

PixelMathでは(というかPIでは)、完全な白(黒)を1(0)として基本的に32bitでデータ処理を行なってます。ですので上の値での0.1は、256諧調でいう25.6の輝度を意味していることに注意してください。

そうしたら,下のように"create new"を選択した状態で下側の四角ボタンをクリックしますと,処理後の画像が出力されます。

f:id:snct-astro:20201014205951p:plain

また、彩度強調を行いたい場合は,数式分母の$TをL画像やG画像で置き換えればよいのだろうと思います。しかし実際にやってみると色がどぎつくなるばかりで色彩強調についてはそれほどうまく行きません。ステライメージでは更に高度な調整が内部で行われているのだろうと思います。

適用結果

パラメータは適当に調整して両者を比較してみます。まずは、ASI294MCで撮影したM13画像に適用してみます。適用前は

f:id:snct-astro:20201014210718j:plain

こんな感じです。以下は、SIとPIでそれぞれデジタル現像処理を行なった結果です。

f:id:snct-astro:20201014184424p:plain

ステライメージによるデジタル現像、暗部スライダ値0.0、明部スライダ値0.02、デジタル現像のハイライト調整値0.02として適用

f:id:snct-astro:20201014184548p:plain

PixelMathによるデジタル現像、(4)式をm=0.0、n=0.02、p=0.02ととして適用。

パラメータ値が対応がついていないか、関数形に微妙な差があるかで、もちろん完全には一致しませんが、高輝度部の圧縮の様子などは大体一致していると思います。

 

次に、デジカメで撮影したぎょしゃ座周辺の星野写真でテストしてみます。適用前は

f:id:snct-astro:20201014211102j:plain

EOS6D(HKIR)にて撮影。背景輝度値はおよそ0.35

こんな感じです。SIとPIでそれぞれデジタル現像処理を行うと、次のようになりました。

f:id:snct-astro:20201014214705j:plain

SIによるデジタル現像。暗部スライダ値19660(=0.3*65535)、明部スライダ値26214(=65535*0.4)、デジタル現像のハイライト調整値26214(=65535*0.4)として適用

f:id:snct-astro:20201014215023j:plain

 PixelMathによるデジタル現像、(4)式をm=0.3、n=0.4、p=0.1ととして適用。 

じゃかんPixelmathのほうが暗くなる感じですが、大体同じなのじゃないかと思います。

終わりに(というか、対数現像を真似たい)

まだ完全とはいえませんが、SIのデジタル現像をだいたい再現できたのではないかと思っています。改善点などありましたらぜひコメントください。

しかし本当に再現したいのは荒井俊也氏が考案し、FlatAideProに実装されている「対数現像」です。今回はそのための練習でした。詳細は公開されていませんので、当てずっぽうで予想するしかありません。手がかりは2つ:

  • 「対数」現像というのだから対数関数が使われているのだろう。
  • 対数現像では、デジタル現像に比べて高輝度部で諧調が豊かなのがはっきりと分かるので、高輝度領域でのトーンカーブの傾きが関数(1)に比べて大きくなるような関数が使われているのだろう。

です。対数現像もFAPにてレベル調整にプラスする形で実装されています。上記と似たような方法で再現できると思いますが、もう少し考え中です。うまくいったらまた報告します(報告していいのだろうか、商売の邪魔?)。