新たな星マスク

私はこれまで、画像中の星をそのままの状態で完全に維持する事で良い星マスクが出来ると思っていました。ところが、実際の星像は収差やゴーストによって周囲の広がりが曖昧で、境界を明確に規定することが出来ません。さらに収差の影響で星像が乱れていても、これまでの星マスクは元画像から星だけをぼかした画像を減算することで星を取り出していたため、歪な形のままのマスクしか作れませんでした。

今回新たに考案した星マスクは計算された座標に星像を描いて作る星マスクです。それが良いことなのか悪いことなのかは別にして、作製方法を説明します。2011.1.6

2011.2.8 StarPlotter Ver.1.51 公開
 
2011.1.18追記

2011.1.9追記 見かけの重星処理について


戻る

とりあえず、今回紹介する新しい星マスクで処理したオリオン座中心部です。

左は従来処理、右が新しい星マスクです。左上にLPS-V3FFの影響と思われる星の伸びが見られるのですが、新しいマスクはこれをかなり緩和してくれています。ISO1600なので綺麗な星像ではありませんが、マスクの効果は、はっきり分かります。

歪な星像の重心位置に円形の星マスクを置く事で収差などによる星像の乱れを緩和することが可能な事が分かります。 

では、作り方をご紹介します。

 
まず最初に、

1, 従来の星マスクを作製します。(その作り方についてはC恒星マスク@星マスクの世界を参照)

 特に調整は必要なくボカシ画像から減算したものをグレースケールに変更し、レベルを調整します。

2,2階調化(グレースケールでも処理出来ますが、フォトショップ上で融合する恒星を分離した方が楽です)
 フォトショップの上で2階調に変更します。注意する点は
 ・ある程度濃度のある星を残す(あまり小さな星は消してしまう方がよいです)。
 ・2階調化によって境界がつながってしまう恒星が分離する程度に止める。
 
この画像を8bitで保存します。
 
ここからが、これまでと大きく違います。 
 
imageJでの処理

このソフトはwindows上で動く画像解析ソフトNIHimageのようなものです。理系の大学に進まれた方の中にはお世話になった方もいると思います。フリーソフトですが非常に強力です。使い方はなじみの無い方には分かりづらいので今回の処理に必要な部分のみを説明します。日本語の解説サイトもいくつかありますので、参考にして下さい。

まずは対象となる画像を開きます。
 画像が8bitであることを確認します。16bitの場合は8bitに変更します。
 
image>Adjust>Thresholdを開きます。2階調の場合はレベル128でいじる必要はないので、そのままsetします。グレースケール画像の場合はここで計算するレベルを決めます。2つの恒星がつながってしまう場合はProcess>Binary>watershedを試してみると良いでしょう。 
次にAnalyze>set measuermentsを開いて、左に示すチェックボックスをチェックします。小数点は真円度があるのでデフォールトの3でよいでしょう。

※後述の重星処理で使うので、fit ellipseにもチェックを入れて下さい。このチェックが間違っているとStarPlotterは動きません。
Analyze>analyze particles を選択し、左のチェックボックスをチェックして実行します。
showはoutlinesが良いでしょう。
数秒で結果が出力されるので、この表を保存します。拡張子はエクセルですが、普通のカンマ区切りテキストと同じです。

左から通し番号、エリア、重心、外接する四角形の座標、四角の縦横、真円度が表示されています。 
  画像上にある全ての星の重心、ピッタリ収まる長方形サイズ、真円度がExcelで読み書き可能なテキストファイルとして出力されます。まるで夢のような機能です。あとはこの情報から重心座標の位置に丸い星を適正な大きさで書いていけば良いわけです。
   
問題はここからで、現在の所この作業をやってくれるソフトを見付けることが出来ません。

フォトショップのスクリプトでこのような作業が出来ると最高なのですが、ファイルを扱えますかね???

とりあえずVBで作ってみました(良いソフトを見付けられなければ公開しようと思います)。

重心の計算はimageJで完了しているので、ここでやることはファイルをシーケンシャルに開いて順番に円を描いていくきわめて単純な動作です。問題はサブピクセルが扱えないので、重心座標に小数点が付いていても作図には生かせない事です。星の直径は外接する長方形の大きさ形、真円度から適当な係数を見付けてやれば良いと思います。

結果はクリップボードに保存されるので、これをフォトショップで新規画像として取り込んで星マスク画像とするわけです。必要に応じてガウスボカシを使うと境界が滑らかになります。
このマスクを通常の星マスクから減算すれば収差部分をマスクする画像を作り出す事ができます。以前我流処理で挑戦したことがありますが、精度はその比ではありません。

使用例をあげますが、このテーマに興味を持って読んだ方は既にいろいろなアイデアが浮かんでいると思います。
 
使用例


星マスク無しの星像です。若干星が伸びている上に青の滲みがクッキリ出ています。 
 これまでの星マスクでの処理

青滲みはかなり抑えることが出来ますし、星像の肥大化も軽減されています。これは@星マスクの世界の方法を使っています。
収差部分のマスクを使った処理

収差が無くなるわけではありませんが、極力強調せずに全体の処理を進めることが出来ます。

さらに工夫すれば収差を除去することも可能になるかも知れません。その場合問題になるのは、除去した収差部分に埋める素材をどのように作製するかということです。 
   
2011.1.9 追記
見かけの重星の処理について
 
星マスクとして選択された星を円で置き換える処理は上手く行ったのですが、画像を注意深く見てみると、近接した2つの星で、2階調化するとつながってしまう場合、つながった画像の重心に円が1つ描かれている場合がありました。これは何ともいただけないので、見かけの重星処理を行うことにしました。imageJの分析項目を1つ増やして、Fit Ellipse にチェックを入れます。これで分析結果からwatershedによって2つに分離されない星を、描画ソフトの方で検出して2つの円を当てはめるようにしてみました。
実験用のサンプル重星です。

2つの星ほ距離、各中心を結ぶ線の角度、それぞれの大きさなどが、問題となります。imageJの分析項目と自分の限界を考慮して、2つの星の大きさが極端に異なる場合に円の大きさを描き分けるという部分は手を付けず、とにかく2つに分ける事にしました。 
まず、watershedを使ってみます。Process>Binaryの MakeBinaryでバイナリー化してwatershedを行います。すると上2つの重星は2つに分けることが出来ました。しかし残りの4つはそのままです。 
watershedで2つに分かれた星は問題なく別々に分析されています。しかし残る4つは1つの塊として分析されていることが分かります。その特徴は、実面積と外接する長方形の面積差、真円度からある程度判断出する事にします。 
分析結果から円を描くソフト(命名:StarPlotter)に重星を判断する機能を追加し、ちょっと使い勝手を見直しました。重星処理については他のソフトで代用することは不可能でしょう。エラー処理とか細かな作り込みは足りないのですが、とりあえずどんな物か試してみたい物好きな方もいるかも知れませんので公開します。画素数は私の手持ち機材が選択出来るようになっていますが、手書き入力可能でEOS60D程度の画素数には対応出来ます。

DATAの部分は、描画のために設定したデータを保存、再利用するための物です。一応デフォールトに戻すボタンも付けました。

左はサンプル重星を分析したデータから作り出されたマスク用の星像です。重星もそれらしく描かれています。何処まで認識させるかはそれぞれの画像で結果を見ながら微調整が必要です。上手く行った数値をSAVEで保存して、再利用するときはLOADする事が出来ます。
 
もとになったサンプル星像と、StarPlotterで描いた画像を重ね合わせました。かなり満足のいく出来映えです。

この画像を見ると、マスクの使い方を工夫すれば、収差やガイドミスの補正だけでなく、純粋に星像縮小効果が期待出来ることもお分かりいただけると思います。Deconvolutionと異なり、星像の補正から、ぼやけた星雲の解像度が増すことはないので所詮小手先の処理ですが、カメラレンズ撮影ではそれなりの利用価値があると思います。

 
  問題点

・Watershedを行うために2階調化すると明度を考慮した質量中心が使えない
・Fit Ellipseを選択するとCentroidが重心ではなく楕円の中心になるの??
・サブピクセル処理が出来ないので、計算精度を上げても、作図ではたいして効果が得られない
・PhotoshopCS5をWindowsXPで使用すると、メモリー不足でクリップボードをペースト出来ないことがある。

気が向いたら検討してバージョンアップを目指したいと思います。
 
ダウンロードはこちらから
 
imageJは、こちら


StarPlotterは、こちら
 このソフトはフリーです。なお使用に際して生ずるいかなるトラブルにも責任を負いかねますのでご了承下さい
   
2011.1.18
やはり完璧にはならない重星処理・・・
 重星処理は最後の詰めが上手く行きません。

imageJの分析結果は粒子1つずつに番号が振られるので、元画像と比較して問題のある粒子をチェックしています。
・元画像では重星なのに、starplotterでは単星
・元画像は単星なのに、starplotterでは重星
・元画像と極端に大きさが異なる
以上の3点について粒子のサイズ毎にエラーが起こる特徴を調べていますが、現状では決め手がありません。
これまで見当をつけたポイントは、

・同じような形の粒子でも、大きな粒子ほど真円度が小さな値となる。 
・外接する長方形の面積と粒子の面積は0.7程度が境界となるが、単独では判断できない事が多い
・近似した楕円の短径と長径も有効な判断材料になりそうだ

こんな感じです。もう、なんの事やっているのか分からない状況です。冬ごもりの時間潰しとしては過去最高のネタでしょう・・・

この画像から
 

これになる。
3枚をじっくり比較するとstarPlotterで作り出される星マスクの
よい点と悪い点がはっきり分かります。

収差やスケアリングの問題で伸びた星を丸いマスクで補正するアイデアはうまく行ったのですが、マスク用の星が無くなったり増えたりするのは、いかに観賞用写真と言っても面白くないです。 

上の三枚を眺めていると2階調にする段階でかなり元の形が損なわれている感じがしますが、これが画像処理でレンジを切り詰めた時に現れるゴーストや収差による星の裾野の広がりをスッパリと切り分けた形と言えると思います。だからこそimageJで解析処理する意味があるとも言えるのでしょう。


果たして実用化出来るのかどうかの正念場です。まだ公開していないVer.1.3では粒子の面積でヒストグラムを作り、それぞれの大きさで重星判別の調整をするようにしています。PSのCS3ならばクリップボードが使えるので何枚かマスクを作ってちょうど良い所を見付けるのは簡単です。と言っても、完璧になることはありません。3重星とか3連星、豚の足跡のような重星、思うようにならない場合も多々あります。後は収差と重星を区別するために中心から放射状に線を引いた場合の角度を想定し重星処理の重み付けをしてみたり、試行錯誤の状態です。


いずれにしても重星処理の精度を上げるには画像毎の細かな調整が必要で、実用面では余りよいことではありません。そこで、 「○○とハサミは使いよう」、「スタートからゴールに到達できない時はゴールから迎えに行く」ということで、星が密集した画像でもStarPlotterのエラーを少なくるには処理する画像を2階調化する段階で粒子数を1万個程度に抑えれば良いという考え方も試してみました。頑張って4万個処理しても実際の微恒星は10万個に近い数になると思うのでキリがないのです。重星が増加しない程度に抑えて処理し、残りの恒星は通常の星マスク画像を使うことで飛躍的にエラーを抑えることが出来ました。微光星だけをもう一度imageJで解析し直す方法も思いついたのですが、現実的に効果があるのかどうか分からないので、いずれまた。



サンプルに使った画像はLPS-P2フィルターをバックフォーカスを調整せずに使用したため星像が大きくなってしまったM31です。StarPlotterで左に示す2種類のマスクを作って星像補正しています。簡単に説明すると大きな恒星マスクで通常の星マスクの明るい恒星をマスクして、そこにStarPlotterで作ったマスクをはめ込むという手順です。

左の画像を比較する限り、なかなか良い感じになります。
比較的恒星の多い画像でも試してみました。

これはBorgの新型レデューサ7878を使った画像を再処理したものです。以前の処理では明るい恒星のゴーストがかなり気になる画像です。 

StarPlotterで9千個の明るい恒星をマスクし、残りは従来の星マスクを使うハイブリットタイプの星マスクで、画像処理を行いました。ついでにゴースト処理用にStarPlotterでゴーストが気になる明るさの恒星40個程度のゴーストを含めた大きさのマスクを選択的に作り出して軽減処理をしています。新設したヒストグラムと「○○以下の星を表示しない」が有効です。
 色々問題があって、等倍をお見せできるような画像ではないのですが、こんな感じになります。

重星処理は完璧に行うことは出来そうにありませんが、それを回避した使い方を試みたことで、StarPlotterの自由度が高まった感じがします。imageJで作られるデータをExcel上でマージすることで微光星を含んだ恒星データを構築することも可能になりそうですし、データの中から必要なタイプの恒星のみのマスクを選択的に作り出して画像処理に使うことも容易になりました。
   

 StarPlotter Ver.1.51の使い方

Ver.1.4とボタンの配置が異なります。描画するマスクの濃度を選択できるようになりました。
微光星の大きさを若干調整しました。
  ダウンロードはこちらから 

ダウンロードしたファイルを解凍すると、StarPlotterというフォルダーが現れます。その中にstarplotter.exeがありますのでクリックすれば起動するかも知れません。インストールの必要はありません。

windows7 32bit版では動きます。
   1,従来の星マスクを作製します。

これが作れない場合はStarPlotterを使う前に作れるようになりましょう。
(作り方については、業界ナンバー1サイト「星の牧場」や、C恒星マスク@星マスクの世界を参照)。
   2,星マスクのレベルを調整します。
 imageJで処理する画像は、フォトショップ上で二階調化して処理を行う事をお勧めします。

 @明るい星数千から1万個程度が、お互いにつながらない程度のレベルで二階調化します。暗い星は思い切って消してしTiff保存します。imageJで読み込んだらImage>type>8bitで、必ず8bit化します。

 AimageJを開いて分析する画像を開きます。8ビットであることを確認します。

 BProcess>Binary>make binarryでバイナリ化します(これをやらないとwateshedが使えません)。次にProcess>Binary>watershedを行って分離可能な重星を2つに分けます。

 Bimage>Adjust>Thresholdで分析するレベルをセットしますが、バイナリ化してある場合は必要ないでしょう。

 CAnalyze>set measuermentsを開いて、Area, Centroid, Bounding Rectangle, Fit Ellipseをチェックします。

 DAnalyze>analyze particlesを実行し結果を保存します。
   3,StarPlotterを起動し、「解析データ」ボタンでimageJの解析結果を開きます。

 @描画するスクリーンサイズを正確に入力し、重星処理を開き初期値の広角か望遠を選択し描画します。ここのデータを変更し、保存しておくことも出来ます。
  
  単星数:単1の粒子として描画された星の数
  重星数:1つの粒子を2つの星として描画した数
  真円度:1は真円、小さいほど歪みが大きいらしい
  面積比:外接する長方形と粒子の面積の比。小さいほど長方形内の粒子面積が少ない
  円の占有率:粒子の分析結果から描画された円と実際の粒子面積の比。歪な粒子ほど円の占有率が小さい
  and or:真円度と面積比の関係。通常andがよい
  放射角補正:画像中心からみた粒子の角度と粒子長軸の角度差。
          一致する場合は収差が大きいと仮定し重星処理を行わない。

 Aフォトショップ(出来ればCS3)でクリップボードの画像を開いて元画像と比較して重星のエラーをチェックし、重星処理の変数を調整しエラーを少なくします。上手く行かない場合は二階調化する星をより少なくします。

 B星像をStarPlotterの星の大きさのスクロールバーで10程度に調整し、サブピクセル処理のチェックを外し、大きな星像を描画します。

 Cこの画像を元の星マスク画像のマスクとして、明るい星をマスクしてしまいます。

 Dこれにより前回の二階調化で消された暗い星が残るはずなので、レイヤーを統合し、今度はこの画像を二階調化し同じように解析し結果を別名のファイルに保存します。粒子数は数万から十万程度が良いでしょう。

 E処理する画像にもよりますが、通常2段階で十分ですが、必要ならこれを3段階に分けて行います。
   4,StarPlotterのオートクリアのチェックを外し、手動で画像をクリアできるようにします。
 これで前回の画像を消さずに、複数の解析結果を1枚の画像として描画することが出来るようになります。

 ver1.3までは、Excel上でデータマージを行う必要がありましたが、行制限の問題もあるのでStarPlotter上で画像を重ね書き出来るようにしました。複数ファイルをいくつでも画像上に展開できますし、ファイル毎に設定を変えて描画することが出来るのも便利です。

Ver.1.4で処理

従来の画像
 
新しい使い方で処理した冬の天の川です。中心部星雲の解像度が高まったように錯覚します。

新潟では1月の日照時間が記録的に少ないそうです。お日様が見えないと言うことは星も見えません。そんなわけで今年の冬ごもりテーマは順調に完成に近づきました。

実際imageJでデータファイルを作って描画してみると分かりますが、非常に便利です。一旦作ったデータは何度でもいろいろな条件で再描画出来ますから、必要に応じたマスクを最適な状態で作り出すことが出来ます。これまでのように画像処理技術を駆使してマスクの星像を大きくしたり、小さくしたりと言う苦労が全くなくなります。

人工的な画像で、レンズの収差を軽減したり、甘い星像をシャープにしたりすることが正しい画像処理なのかどうか分かりませんが、私はマスクとして使用する分には問題ないと思います。この星像をL画像に使ったらデザインになってしまいますね。
   ギャラリー
StarPlotterで処理した画像です。M33では合計1800個,オリオン座中心部では35000個、いっかくじゅう座の散光星雲では約60000個のマスク星像を描画して使用しています。魚眼で撮影した天の川は8万数千個の星マスクを描画しました。
 

3段階で2階調化

L:2586, M:9150
S:21124, SS:53125

L:19111, M:35659
S:56459
     
   
StarPlotterで作成したマスク画像を上手く使う工夫をしながら過去の画像をいじっています。Ver.1.5では描画する星の濃度を調整できるようにしてみましたが、その効果はまだはっきりしません。昔の画像をいじっていて気が付いたことを箇条書きにしました。

・M33はVC200Lで撮影した画像で当時歪な星像に悩まされましたが、目立たなくなります(だから光軸を調整しなくてよいとは思いませんが、補正出来ると言うことはありがたいことです)。

・広角レンズで撮影した画像全般に言えますが、星像がスッキリする分、小さな散光星雲が綺麗に見えます。
・この星マスク使用で、従来よりも全体のコントラストを上げることができます。
・分離できない小さな星団内にマスク像が描画されてしまうことがあるので注意が必要です。
・相対的な感じとして、以前より明るい星が目立つようになります。