PHD2の日本語マニュアルを公開しています。こちらからどうぞ。

個人サイト「Starry Urban Sky」もよろしく。

マスク作成の強い味方「StarNet++」

星雲を強調するための「星雲マスク」や、星だけを抜き出した「星マスク」を作成するために、星だけを消去した画像が必要になる場合がしばしばあります。

そうした画像を作成する方法としては、Photoshopの「明るさの最小値」フィルターを使う方法、「FlatAide」を流用する方法などがありますが、先日、某所で「StarNet++」*1という専用フリーウェアが紹介されていました。


ダウンロードはこちらから。
https://sourceforge.net/projects/starnet/


細かい技術的なことは、その方面に詳しくないのでよく分かりませんが、どうやらニューラルネットワークを用いて星像を認識、消去するようです。入力は16bit TIFFのみ、64bit環境でのみ動作、AVX命令のサポートが必要*2、メモリを1~3GBほど使用するなど、注意が必要な点もありますが、かなりの精度で星を消去できるようです。カラー画像用とモノクロ画像用の2つのプログラムが用意されています。


コマンドラインで操作するプログラムですが、使い方は簡単。カラー画像の場合、以下のように入力するだけです*3*4

rgb_starnet++.exe INPUT OUTPUT STRIDE

INPUTは入力ファイル名、OUTPUTは出力ファイル名、STRIDEはニューラルネットワークへの入力サイズ単位になります。OUTPUTは省略可能で、その場合は「starless.tif」というファイル名で保存されます。

また、STRIDEには数字が入りますが、未指定の場合、64が使われます。このプログラムでは、STRIDEで指定された数値を一辺のサイズ(単位:ピクセル)としたタイル状の領域を単位として処理を行います。STRIDEを小さくすれば、アーティファクトを生じたりディテールを損なったりすることなく処理ができますが、処理にかかる時間は2次関数的に増加します。かなり重い作業のため、STRIDEは画質と処理時間との兼ね合いで決めることになります。

StarNet++の実力

それではこのソフトがどのくらいの実力を持っているのか、他の方法と比べてみましょう。サンプルとして、StarNet++に同梱されている以下のサンプル画像を使ってみます。


f:id:hp2:20190718233456j:plain


まずはPhotoshopの「明るさの最小値」フィルター。


f:id:hp2:20190718221509j:plain

「半径」を1pixel、「保持」を「真円率」にして1回かけたものですが、微光星はある程度消えたものの明るい星はガッツリ残っています。また、フィルターの副作用で星雲にまでダメージが及び、モヤモヤした変な模様が浮かび上がってきています。


次にFlatAideでの処理。こちらは普段自分がよく使っている方法です。


f:id:hp2:20190718222728j:plain

とりあえず「星検出エッジしきい値」を101、検出領域の拡張幅を25%、「星領域強制判定濃度」を255としてかけた結果ですが、星の消え残りがいくらかある上に、明るい輝星周りの光芒が消えていません。


f:id:hp2:20190718222746j:plain

手動で修正すると幾分ましになりますが、不自然さは拭えません。


一方、StarNet++で処理した結果ですが……


f:id:hp2:20190718221542j:plain

一目瞭然。圧倒的に優秀です。

輝星を消した跡にブロックノイズのようなパターンが浮かんでいる部分がありますが、こうしたマスクを使う場合、ある程度ぼかして使うのが普通ですし、ここまできれいに消えてくれれば文句はありません。これなら、元画像との差を取ることで「星マスク」も簡単に生成できそうです。


処理時間はRyzen7 2700Xを常時4.0GHzにオーバークロックしたマシンで30秒ほどかかりましたが、このくらいなら許容範囲内です。

STRIDEの効果

ついでなので、STRIDEのパラメータを変えた場合の効果も見てみます。上記と同じ画像を、STRIDEの値を64~8まで変えて処理してみました。


f:id:hp2:20190718233758j:plain

ブロックノイズの目立つ付近を切り出してみましたが、STRIDEの値が小さくなるほどブロックノイズは目立たなくなり、星雲の細部も潰れずに残っています。


こうしてみると、STRIDEの値をとにかく小さくした方が良さそう……と言いたくなるのですが、問題は処理時間。手動計時なのであまり正確ではありませんが、1048×712ピクセルのこの画像を処理するのにかかった時間は

  • STRIDE=64:29.7秒
  • STRIDE=32:94.2秒
  • STRIDE=16:346.5秒
  • STRIDE=8:1352秒

と、STRIDEの値が小さくなるほど極端に伸びてきます*5。最新のほぼハイエンドのマシンを使ってこれなので、普段使いなら小さくても32程度までに留めておいた方が無難でしょう。

*1:元ネタは「StarNet」というソフトで、これをC++に移植してコンパイルしたものです。StarNetは、オリジナルの画像セットによる学習強化やGPUのサポートなどもあり、Pythonなどの扱いに慣れていればこちらの方が何かと融通が利きそうな気はします。

*2:AVX命令セットが実装されたのは2011年のSandyBridge(Intel)またはBulldozer(AMD)以降なので、最近のPCなら大体大丈夫なはずです。

*3:モノクロ画像の場合、rgb_starnetをmono_starnetに読み替えます。

*4:同内容が記述されたバッチファイルも同梱されています。

*5:STRIDEの逆数とかかった秒数をプロットすると、きれいに2次曲線上に乗ります。