DeepSkyStackerの改造

最近、天気は悪くありませんが晴れ間と撮影のタイミングが合わず、撮影できない日が続いています。なので、以前から少しずつ行っているDeepSkyStacker(以下DSS)の改造について記載します。
他の方の参考になるかは微妙ですが、仕事と違って開発ドキュメントも書かずに進めているので自分用の記録という意味でも、撮影ネタがないときに記載していこうと思います。今回はどういう改造をしたかの概要です。

改造の経緯

DSSは、天文に復帰後、星雲などの撮影を始めた時から使用しています。最近はSirilなども使い始めましたが、使い慣れているし最初に出会ったソフトなので愛着もあり、機能追加や改善ができればいいなと思っていました。
ソースは公開されていて、一定の条件を守れば自由に改変ができる様です(BSDライセンス)。仕事を辞めて次の仕事探しものんびりやっているため、主夫もやっていますが少しまとまった時間も取れます。これまで出来なかったことをやってみようと、今年2月頃から改造を開始しました。

現在の状況

今までに改造した項目は以下になります。

  • ズーム/スクロール機能の変更
  • 言語設定によって画面の一部がおかしくなる不具合の修正
  • Dead pixel mapによるホットピクセル除去機能の追加
  • 日本語化
  • ライブラリの更新

中身を理解するのに非常に時間がかかるため、他にも改造したいところはありますが今のところ手がついていません。今後やりたいことは今のところ以下3点です。

  • 高速化
  • オートストレッチ機能の追加(Registering and Stacking画面)
  • 星検出処理周りの改造

改造した機能の概要

改造したそれぞれの項目について、その目的と結果について簡単に記載します。

ズーム/スクロール機能の変更

DSSでは、ズームとスクロールが同時に行われます。見たい箇所をさっとズーミングするにはいいのですがちょっと使いにくいです。なにより、星が流れたフレームを探してスタック対象から外すという様な場合、表示するフレームを変えるとズーム倍率が元に戻ってしまうので、以前から大きな不満でした。

そこで、ズームとスクロールを分け、ズーム倍率を固定する機能を追加しました。
スクロールはスクロールバーを設置し、マウスホイールでもスクロールする様にしました。ズームはCTRL+マウスホイールで行い、ズーム倍率も一時的に表示される様にしてみました。ズーム倍率固定は、ポップアップメニューから指定できます。

これで、星が流れたフレームを探すのが格段に楽になりました。

画面の一部がおかしくなる不具合の修正

この不具合は、英語フォントと日本語フォントの大きさが違うために起きている様です。Webで検索すると「言語をEnglishにする」というのが対応策として出てきます。私はDSSの画像処理機能は殆ど使わずスタック結果を簡易的に見るだけなので、この部分の修正はそんなに優先度は高くなかったのですが、比較的簡単だったので修正してみました。

元のソースにあまり手を加えない様に、画面から中身がはみ出す時だけ内容物の位置を直接指定する様にしました。日本語OSで中国語など幾つかの言語を選択しても同じ不具合が起きますが、その様な場合でもちゃんと表示されます。

中国語は元々サポートされているので、中国版のWindowsでは不具合は起きてないのでしょうね。日本語OS特有の不具合なのでしょうか。

Dead pixel mapによるホットピクセル除去機能の追加

最初の頃は、ホットピクセル除去はダーク減算で行っていました。しかし、ダークが合わないとホットピクセルが残ってしまいます。それで、DSSのCosmetic画面でホットピクセル除去の指定をするようになりました。ただ、この処理だと誤検出される場合も多い様です。
そんな時、AutoStakkert3に[Load Dead Pixel Map]というメニューがあることを知り、これがDSSに実装されればと思っていました。Dead pixel mapは、既存のダークを適当な閾値で2値化することで簡単に作成できます。また、消えないホットピクセルがあれば、Dead pixel mapの該当ピクセル位置に白い点をGIMPなどで追加するだけです。時間をかけてダークを作り直すより楽なのでDSSに実装したいと思っていました。

以下がDead pixel mapを指定する際の操作画面で、ライトフレームなどと同様にファイルをDrag & Dropして種類を指定するだけです。

スタック開始する際の画面では、以下の様に表示されるようにしました。

処理はCosmeticの処理を流用し、ホットピクセルを検出する部分をDead pixel mapで行い、補完処理はそのまま使っています。Cosmeticの機能もそのまま残していて、Dead pixel mapがリストに無いときはオリジナルと同じ動作をします。

この機能を追加してからは、ダークを使わなくなりました。メインカメラのASI533MCPはゼロ・アンプグローなので、ダーク減算なしでもノイズはあまり目立ちませんセンササイズも1インチと小さめで、フラットもバックグラウンド補正や被り補正などで何とかなるので、かなり手抜きの画像処理をやっています。

日本語化

英語版で慣れてしまったので、日本語化の必要性は感じていませんでした。ただ、ズーム/スクロールやDead pixel map などは、ソースを読み込んで処理を把握できないと改造できません。他人のソースはただでさえ理解するのが難しく、また、DSSはMFCMicrosoft Foundation Class)が使われていて今まで経験が少なく処理の理解が大変でした。一方日本語化は多少経験があり、言語切替え部分の修正が簡単にできたので、あとはGoogle先生に翻訳してもらった文字を書き込むだけです。なので、他の改造が上手く行かず煮詰まった時の現実逃避として、少しずつ日本語化していきました。

現在、画面の日本語化は終了していてマニュアルが途中までという状況です。

ライブラリの更新など

DSSは、FitsやRawの読み込みにオープンソースのライブラリを使っています。不具合がある訳ではありませんが、これらを新しいものに入れ替えました。中でもRawのライブラリ(LibRaw)は利用者の要求に対応したパッチ(修正版)を素早く提供している様で、例えばOM SystemのOM-1には4月初めの時点で対応していてDSSでも読み込めました(私はフィルムカメラOM-1しか持ってないので、恩恵は受けていませんが…)。

オープンソースを自分でコンパイルして使うメリットは、改造だけでなくこういう所にもあると思います。

今後について

一通り欲しい機能には対応したので、次の改造はだいぶ先になると思います。それまでは、撮影ネタがないときにこんな感じでブログに残しておこうと思います。今回は要求仕様や外部仕様に相当する内容を、ごく簡単に記載しました。次回以降は処理の中身についても少し触れたいと思います。Cosmeticの処理やパラメータがどう使われているかなどは、他の方にも参考になるかもしれません。いつになるか分かりませんが、興味のある方は御覧頂ければと思います。