Adam Blockさんのyoutubeで,非常にシンプルで効果的なStarReduction(以下SR)の方法が紹介されていました.考案者は B. Blanshenさんという方だそうです.
この方法では,星を小さくしたい元画像に対してStarnet2やStarXTerminatorを使った星消し画像を用意し,PixelMathの上手い数式をつかって二つをブレンドすることで,StarReductionを実現しています.
今までの方法では,星の間にブリッジが発生したり,輝星の周りがぼやけたりという欠点がありましたが,この方法ではそれが避けられています.さらに1パラメータで強弱が調整できます
早速やり方をみて行きましょう.使用するためにはPixinsightが必要です.
導入方法
まず,以下のGoogleDrive
https://drive.google.com/drive/folders/138L6Z2vbTzNAutbfe5cuhL9Pl0-iltRp
より,BillsStarReductionMethods_V2.xpsmをダウンロードしてください(ダウンロードが面倒くさい方は,以下に示す数式をコピペするだけでもOKです).
このファイルを開くと次のようなインスタンスが開きます
これらはPixelMathの数式が入ったインスタンスです.縦に並んだ3つのインスタンスのいづれかを今回は使います.ここでは一番上の
を使ってみます.インスタンスをクリックするとPixelMathが開きます.そこには以下のような数式が書かれています
/* Star Reduction using PixelMath, by Bill Blanshan -
Transfer Method - V2 */
S= 0.15 ;// <--To reduce stars size more, lower "S" value
Img1= Starless ;// <--Starless image name, yours must match
/*
Drag bottom left arrow over to the image you require star reduction
Enjoy!!
*/
//equations
f1= ~( (~mtf(~S,$T)/~mtf(~S,Img1) )*~Img1); //Transfer method
max(Img1,f1)
ちなみに,二つ目のインスタンスには
/* Star Reduction using PixelMath, by Bill Blanshan -
Halo Method - V2 */
S= 0.15 ;// <--To reduce stars size more, lower "S" value
Img1= Starless ;// <--Starless image name, yours must match
/*
Drag bottom left arrow over to the image you require star reduction
Enjoy!!
*/
//equations
f2= ( (~(~$T/~Img1)-~(~mtf(~S,$T)/~mtf(~S,Img1) ) )*~Img1);
f3= (~(~$T/~Img1)-~(~mtf(~S,$T)/~mtf(~S,Img1) ) );
max(Img1,$T-mean(f2,f3))
三つ目は以下の通り.
/* Star Reduction using PixelMath, by Bill Blanshan -
Star Method - V2 */
Img1= Starless ;// <--Starless Image name
I= 1 ;// <--number of iterations, between 1-3
M= 1 ;// <--Method mode; 1=Strong; 2=Moderate; 3=Soft reductions
/* Drag bottom left arrow over to the image you require star reduction
Note:
Strong mode produces smaller sharp stars while removing small stars
Moderate mode still has sharp stars and some smaller stars
Soft mode is a simple star reduction of the original image */
//equations:
E1= $T*~(~(Img1/$T)*~$T); //iteration-1
E2= max(E1,($T*E1)+(E1*~E1) );
E3= E1*~(~(Img1/E1)*~E1); //iteration-2
E4= max(E3,($T*E3)+(E3*~E3) );
E5= E3*~(~(Img1/E3)*~E3); //iteration-3
E6= max(E5,($T*E5)+(E5*~E5) );
E7= iif(I==1,E1,iif(I==2,E3,E5)); // Strong reduction mode
E8= iif(I==1,E2,iif(I==2,E4,E6)); // Moderate reduction mode
E9= mean(
$T-($T-iif(I==1,E2,iif(I==2,E4,E6) ) ),
$T*~($T-iif(I==1,E2,iif(I==2,E4,E6) ) ) ); //soft reduction mode
max(Img1,iif(M==1,E7,iif(M==2,E8,E9) ) )
これらの式の意味は,まだ理解していません.でもとにかく使ってみましょう.
使用方法と結果
(3つ目のインスタンスを例外として)上の数式で3行目にあるパラメータ” S ”が効果の強さを表します.この値が小さいほど星が小さくなります.S=0.5がニュートラルで星の大きさが変化しません.
画像に適用するためには,あらかじめStarNet2などを使って生成した星消し画像を用意しておき”Starless”と名前を付けておきます
この状態で,PixelMathの▲を元画像にドラッグ&ドロップするだけで,処理はおしまいです.
結果を見てみます
右が使用前,左が使用後です.左上のあたりを拡大してみると
こんな感じ.北天ではもっとも星が密集している北アメリカ周辺ですが,きれいに星を小さく出来ているようです.
従来方法との比較
この方法の副作用について,まだ十分に検証出来てはいません.しかし,顧問が試した範囲では,従来の方法の欠点が克服されていました
たとえばMT(明るさの最小値)を使うSRでは,微光星の間に架橋が発生してしまう欠点がありました.
今回の方法では,MTを使用していないので,その心配はなさそうです.実際,同じ領域を見てみますと,確かに架橋は抑えられています.
星が楕円なのは,ガイドエラーです
また,AdamBlockさんの開発したスクリプト”Ez StarReduction”は,ドーナツ型のマスクを使用するために,明るい星の周りが不自然にボンヤリするという欠点がありました.今回の方法ではその点も改善されています
右が”Ez StarReduction”の適用後で,中心の星の周りがすこしボケています.左の方は今回の方法の適用後で,中心星の周りに不自然さはありません.
終わりに
というわけで,世界にはアイデアの優れた方が居るのですねえ.数式の意味が理解出来たら,また更新します.
ちなみに,効果の強さを表すパラメータ S は,HistogramTransformationの中間スライダの値に関係しています.中間スライダを右に寄せて,例えば0.85とすると以下のように画像が暗くなります.この時の星の大きさを最終画像に適用したかったら,
S=1-0.85=0.15
とすればよいようです.なんともわかりやすい
後日追記
PixelMathの数式の意味ですが,Twitterでおののきももやすさんが教えてくれました.
これはスクリーン合成については自分もやってましたが、反転割り算があるわけですな🧐
— おののきももやす@意識を低く保つ (@tjm8874) 2022年8月16日
・オリジナル背景部分 0.15→反転で0.85
・Starless背景部分 0.15→反転で0.85
・0.85/0.85=1の反転は0、背景が消える
自分がやってたのとこのV1プロセスの比較してみました pic.twitter.com/r2yTCB5Vl1
分かってみれば簡単でした.要は
(元画像の反転)/(星消し画像の反転)
という計算で(星だけ画像の反転)を作っておいて,それをmtf関数で暗くしたあと,星消し画像とスクリーン合成する.という考え方のようです.