天文はかせ幕下

pixelMathによるスターリダクションの応用編

先日,pixelmathの演算を利用した,スターリダクション(以下SR)の方法について紹介しました.

この方法では,星を暗くするのにmtf(midtone transfar function)という関数を使っています.要はレベル補正で中間スライダを動かすときの「例の」曲線です.

後の結果との比較のため,この方法を使ったSRの実行例をあげておきます

PixelMathを利用したSRの実行例

今回の趣旨は,このmtf関数の形を少し工夫すればSRの作用をコントロールできるのでは?ということです.アイデアの元になったのは,先日のエントリでkさんから頂いた「中間の明るさの星だけにSRが作用するようにできないか?」というコメントでした.

効果は以下の通り:

早速やってみます.

小さい星を保護するSR

小さくて暗い星にSRをかけたくない場合は,次のような形をした関数を使えばいいはずです.

画像

元々のmtf関数に比べると,原点に近い部分がy=xの直線に接している点異なります.すると暗い星は変更を受けないことになります.こういう形の関数はいろいろ考えられますが,例えば  0<x<1 として

y=x^m(1-x^{-\gamma})+x

といった式を考えてみました

PixelMath にて

[RGB/K]

gamma=1.0; //laeger value to reduce stars strongly

ssf=3.5; //larger valure to protect tiny stars

 

//equations

 

Img1 = $T^ssf*(1-$T^(-gamma))+$T;

Img2 = Starless^ssf*(1-Starless^(-gamma))+Starless;

 

~((~Img1/~Img2)*~Starless);

[symbols]

Img1,Img2, gamma, ssf

と書いて実行してください.あらかじめ,タグに”Starless”と名前を付けた星消し画像を,Starnet2などをつかって用意しておく必要があります.

この式では,”gamma”を大きくするとSRの効果が強くなり,”ssf”を大きくすると微光星を保護する効果が強くなります.デフォルト値は,だいたい程よいと思われる値にしてあります.

今回の画像では以下のような結果になりました.

光星を保護するSR

それほどわかりやすくないですが,従来のSRを施した左に比べて,右の画像は微光星が多く残っています.この方法は,特に長焦点で星の数がもともと少なく,極めて暗い星を消したくないときに有効だと思います.

 

星の芯を残すSR

高輝度部分にSRを作用させないような関数を用意すれば,星の芯を残すことができます.そのためにはこういう関数を使えばいいでしょう

画像

元々のmtf関数に比べると,x=y=1に近い部分がy=xの直線に一致しています.ただこの関数を単純な多項式で作ることができませんでした.結局考えたのはこんな長い式です

y=f_m(x)\dfrac{x}{\gamma}+g_m(x)x

ここで f_m(x) g_m(x) は次のシグモイド関数

f(x)=\dfrac{1}{1+e^{s(x-1/2)}},~g(x)=\dfrac{1}{1+e^{-s(x-1/2)}}

をつかって,

 f_m(x)=f(x)+1-f(0)+\{f(0)-f(1)-1\}x
 g_m(x)=g(x)- g(0) + \{1-g(1)+g(0)\}x

としています.

これらはPixelMath にて

[RGB/K]

gamma=3; //laeger value to reduce stars strongly

ssf=6; //larger valure to protect bright stars

 

//equations

f0=1.0/(1.0+exp(-ssf/2.0) );

f1=1.0/(1.0+exp(ssf/2.0) );

g0=1.0/(1.0+exp(ssf/2.0) );

g1=1.0/(1.0+exp(-ssf/2.0) );

 

Img1 = ( (1.0/(1.0+exp(ssf*($T-0.5) ) ) ) + (1.0-f0) + (f0-f1-1)*$T)*$T/gamma + ( (1.0/(1.0+exp(-ssf*($T-0.5) ) ) ) - g0 + (1-g1+g0)*$T)*$T;

Img2 = ( (1.0/(1.0+exp(ssf*(Starless-0.5) ) ) ) + (1.0-f0) + (f0-f1-1)*Starless)*Starless/gamma + ( (1.0/(1.0+exp(-ssf*(Starless-0.5) ) ) ) - g0 + (1-g1+g0)*Starless)*Starless;

 

~( (~Img1/~Img2)*~Starless);

[symbols]

Img1,Img2,gamma, ssf,f0,f1,g0,g1

と入力して実行できます.ここでは,”gamma”を大きくするとSRの効果が強くなり,”ssf”を大きくすると高輝度部を保護する効果が強くなります.デフォルト値は,だいたい程よいと思われる値にしてあります.

今回の画像では以下のような結果になりました.

高輝度部を保護するSR

これもそれほどわかりやすくはないですが,星の芯の部分の輝度が保たれています.こちらの方法は,顧問が試した範囲では広角の天の川の写真などに適用すると,いい感じでした.

星の芯を残す Ver2

Ramb(天の川のしらなみ)さんから,もっとシンプルな数式を教えてもらいました

 (1-x)^m\{1-(1-x)^\gamma\}

というものです.ただし 0 \lt \gamma \lt 1, m \gt 2でないと狙った効果になりません.

gamma=0.9; //must be (0<gamma<1) larger value reduce stars strongly

ssf=2.5; //must be (ssf >2) larger valure to protect bright stars

delta=0.000001; //small factor to avoid 1/0 calc.

//equations

 

Img1 = (1.0-$T)^ssf*(1.0-(1.0-$T+delta)^(-gamma) )+$T;

Img2 = (1.0-Starless)^ssf*(1.0-(1.0-Starless+delta)^(-gamma) )+Starless;

 

~( (~Img1/~Img2)*~Starless);

[symbols]

Img1,Img2,gamma, ssf, delta

お好みのほうをご利用ください

 

 

星の明るさをほぼ不変に保ってレベル補正

最後に,上の二つと毛色が違いますが,チョットした応用で星の明るさを不変にして,レベル補正(の中間スライダ調整)を行うこともできます.例えば,m=0.6のmtfを作用させて画像を暗くした後,m=0.4のmtfをもう一回施して画像を明るくすると,ほぼ結果が変わらないことを利用します.

PixelMath にて

[RGB/K]

S= 0.4 ;//0.5 newtral,

Img1= Starless ;// <--Starless image name, yours must match

 

//equations

f1= ~( (~mtf(~S,$T)/~mtf(~S,Img1) )*~Img1); //Transfer method

mtf(S,f1)

[Symbols]

S,Img1,f1

とします.

星を不変に保つレベル補正

これもあまりわかりやすくはないですが,星は影響を受けずに画像が明るくなっています

 

サムネ用