先日,pixelmathの演算を利用した,スターリダクション(以下SR)の方法について紹介しました.
この方法では,星を暗くするのにmtf(midtone transfar function)という関数を使っています.要はレベル補正で中間スライダを動かすときの「例の」曲線です.
後の結果との比較のため,この方法を使ったSRの実行例をあげておきます
今回の趣旨は,このmtf関数の形を少し工夫すればSRの作用をコントロールできるのでは?ということです.アイデアの元になったのは,先日のエントリでkさんから頂いた「中間の明るさの星だけにSRが作用するようにできないか?」というコメントでした.
効果は以下の通り:
早速やってみます.
小さい星を保護するSR
小さくて暗い星にSRをかけたくない場合は,次のような形をした関数を使えばいいはずです.
元々のmtf関数に比べると,原点に近い部分がy=xの直線に接している点異なります.すると暗い星は変更を受けないことになります.こういう形の関数はいろいろ考えられますが,例えば 0<x<1 として
といった式を考えてみました
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を作用させないような関数を用意すれば,星の芯を残すことができます.そのためにはこういう関数を使えばいいでしょう
元々のmtf関数に比べると,x=y=1に近い部分がy=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”を大きくすると高輝度部を保護する効果が強くなります.デフォルト値は,だいたい程よいと思われる値にしてあります.
今回の画像では以下のような結果になりました.
これもそれほどわかりやすくはないですが,星の芯の部分の輝度が保たれています.こちらの方法は,顧問が試した範囲では広角の天の川の写真などに適用すると,いい感じでした.
星の芯を残す Ver2
Ramb(天の川のしらなみ)さんから,もっとシンプルな数式を教えてもらいました
というものです.ただしでないと狙った効果になりません.
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
とします.
これもあまりわかりやすくはないですが,星は影響を受けずに画像が明るくなっています
サムネ用