Skip to content

jctk/MakeTimelapse

Repository files navigation

MakeTimelapse

MakeTimelapse は、JSol'Exの画像ファイルからタイムラプス動画を生成するツールです。
個人的に作成したツールですのでうまくいかない場合もご容赦ください。
特に生成に使用する画像の形式は限定されています。

特徴

  • 画像の自動並び替え(タイムスタンプ順)
  • 高品質なタイムラプス動画の生成
  • シンプルなコマンドライン操作
  • カスタマイズ可能なフレームレートと解像度

導入条件

  • Windows 11
  • おそらく Linux でも実行可能

導入

以下手順で実行環境を構築する

  1. 以下ソフトウェアを導入。環境変数PATHを通すこと。

    • 必須
      • python
      • FFmpeg
    • 任意
      • PowerShell 7
  2. pythonのライブラリの導入

    PS> pip install numpy astropy opencv-python SimpleITK scipy Pillow
  3. スクリプトの展開

    • スクリプトを clone する。
    PS> git clone https://github.com/jctk/MakeTimelapse.git
    PS> cd MakeTimelapse

ディレクトリ

  • リポジトリに登録されているフォルダー
MAKETIMELAPSE       プロジェクトのルートフォルダ。実利用するスクリプトを保存
├─.vscode           vscode用設定
├─samples           各種サンプルデータ用フォルダ
│  ├─10_simple      単純な画像による検証用
│  │  └─input
│  ├─20_sun_half    小さめの太陽の画像による検証用(JSol'Ex Geometory corrected)
│  │  └─input
│  ├─30_sun_full_autostretch    大きい太陽の画像による検証用(JSol'Ex Geometory corrected(processed))
│  │  └─input
│  ├─40_sun_full_disk   大きい太陽の画像による検証用(JSol'Ex Geometory corrected)
│  │  └─input
│  └─90_postprocess 後処理用素材(Shotcutで使用するファイルなど)
└─tools             検証などで使用する一括処理用ツール

実行手順

  1. Sol'Exで太陽を複数撮影
  2. JSol'ExのBatchモードで画像を出力
    • 確認済みの主な条件
      • Process Parameter
        • Autocorrect P angle: ON
        • Rescale to full resolution (allow oversampling): ON or OFF
      • Miscellaneous
        • Assume mono imamges: ON
        • Generate FITS files: ON
      • Custom process: Image selection ※以下いずれの画像も可
        • Geometry corrected iamge: ON
        • Geometry corrected iamge (processed): ON
  3. make_timelapse.py を実行、複数の画像の位置合わせと動画の生成
    • JSol'Ex で生成した画像から位置合わせに使用する基準画像を選択する。真円に近い、表面が緻密、歪みが少ない、などの条件に合う画像が望ましい。
    • 画像サイズは一致しているのが望ましい。一致していない場合も処理はできるが、太陽のサイズが均一になるようにトリミングされているのがよい。
    • 位置合わせが合わない場合、位置合わせ後の画像を入力として再度位置合わせを行うことも可
    • make_timelapse.py のフロントエンドGUIの make_timelapse_gui.py の利用可
  4. (任意)gemerate_movie.py の実行
    • make_timelapse.py が出力した位置合わせ画像を元に動画の作成が可能

各コマンドの説明

make_timelapse.py

PS MakeTimelapse> python .\make_timelapse.py --help
usage: make_timelapse.py [-h] --ref REF [--input_dir INPUT_DIR] [--aligned_dir ALIGNED_DIR] [--movie MOVIE] [--iterations ITERATIONS] [--stddev STDDEV] [--workers WORKERS] [--fast]
                         [--multiscale] [--crf CRF] [--fps FPS]

Sol'Ex画像の歪み補正タイムラプス作成

options:
  -h, --help            show this help message and exit
  --ref REF             基準となるモノクロ画像(fits, fit, png)のファイルのパス
  --input_dir INPUT_DIR
                        入力画像ファイル(fits, fit, png)のフォルダー
  --input_filter INPUT_FILTER
                        入力ファイルのベースネームに対する正規表現フィルタ(拡張子とディレクトリは除く)
  --aligned_dir ALIGNED_DIR
                        位置合わせ後画像の保存フォルダー
  --movie MOVIE         動画の出力ファイル名
  --iterations ITERATIONS
                        DemonsRegistrationFilterの反復回数
  --stddev STDDEV       DemonsRegistrationFilterの標準偏差
  --workers WORKERS     並列処理のワーカー数(デフォルトはCPUコア数)
  --fast                高速版DemonsRegistrationFilterを使用する
  --multiscale          マルチスケール Demons を使用する(実験的実装)
  --crf CRF             ffmpegの画質設定(デフォルト: 23)
  --fps FPS             動画のフレームレート(デフォルト: 7)
  --caption             各フレームの左下にファイル名を表示する
  --caption_re PATTERN REPLACEMENT
                        ファイル名の置換(正規表現): PATTERN を REPLACEMENT に置換
  --aligned_width ALIGNED_WIDTH
                        位置合わせ後に強制する出力画像の幅(ピクセル)
  --aligned_height ALIGNED_HEIGHT
                        位置合わせ後に強制する出力画像の高さ(ピクセル)

make_timelapse_gui.py

  • make_timelapse.py のフロントエンドとなる gui

gemerate_movie.py

  • 画像(PNG, FITS)から FFmpeg を使って動画を生成する。
  • 通常このスクリプトは使用しない。make_timelapse.py で位置合わせ後に動画の生成も行うため。
  • make_timelapse.py で画像を選定しての位置補正を再度行った場合に、再実行なしと再実行したファイルを一つのフォルダーに集めてからこのスクリプトを用いて動画を作成する。
PS MakeTimelapse> python .\generate_movie.py --help
usage: generate_movie.py [-h] [--fps FPS] [--crf CRF] [--caption] [--caption_re PATTERN REPLACEMENT] input_dir output_file

画像(PNG, FITS)から FFmpeg を使って動画を生成します。

positional arguments:
  input_dir             画像が含まれる入力ディレクトリ
  output_file           生成する動画ファイル名(例: output.mp4)

options:
  -h, --help            show this help message and exit
  --fps FPS             動画のフレームレート(デフォルト: 10--crf CRF             画質(CRF値 150、デフォルト: 23--caption             各フレームの左下にファイル名を表示する
  --caption_re PATTERN REPLACEMENT
                        ファイル名の置換(正規表現): PATTERN を REPLACEMENT に置換

measure_quality.py

PS MakeTimelapse> python .\measure_quality.py --help
usage: measure_quality.py [-h] --type {fits,png} [--csv CSV] [--input_filter INPUT_FILTER] [--ms-top-percent MS_TOP_PERCENT] [--ms-no-mask] dir

太陽画像の品質計測スクリプト

positional arguments:
    dir                   画像ディレクトリ

options:
    -h, --help            show this help message and exit
    --type {fits,png}     画像形式
    --csv CSV             品質数値をCSV出力する場合はファイル名を指定
    --input_filter INPUT_FILTER
                                                入力ファイルのベースネームに対する正規表現フィルタ(拡張子とディレクトリは除く)
    --ms-top-percent MS_TOP_PERCENT
                                                multiscale_sharpness の上位パーセンタイル(デフォルト: 10--ms-no-mask          multiscale_sharpness で中心マスクを使わない(デフォルトはマスクを使用)

nomalize_image.py

  • このスクリプトは基本的に使用しない。make_timelapse.py で基準画像に合わせたヒストグラムの調整を行うので必要がない。
PS MakeTimelapse> python .\normalize_images.py --help
usage: normalize_images.py [-h] --ref REF --input_dir INPUT_DIR --output_dir OUTPUT_DIR

Normalize contrast and brightness of 16-bit PNG images using a reference image.

options:
  -h, --help            show this help message and exit
  --ref REF             Path to the reference image
  --input_dir INPUT_DIR
                        Path to the input directory containing PNG images
  --output_dir OUTPUT_DIR
                        Path to the output directory to save processed images

仕組み - マルチスケール位置合わせ

  • 以下は make_timelapse.py のオプション --multiscale を実現する multi_resolution_demons 関数の仕組み

  • multi_resolution_demons 関数は、画像の位置合わせ(レジストレーション)を高精度かつ安定的に行うために、マルチスケール(多段階)処理を用いた Demons アルゴリズムの実装である。画像の解像度を段階的に変えながら変位場(displacement field)を更新することで、ノイズの影響を抑えつつ、より滑らかで正確な位置合わせを実現する。

処理の流れ

  1. 初期変位場の作成
    基準画像(fixed)と同じサイズ・情報を持つ初期の変位場(initial_field)を作成する。これは後の各スケールでの変形のベースとなる。

  2. スケールごとの処理
    以下の3段階の縮小率(shrink factor)で画像を処理する:

    • 4倍縮小(粗いスケール)
    • 2倍縮小(中間スケール)
    • 元のサイズ(細かいスケール)

    各スケールでは以下の処理を行う:

    • 基準画像と移動画像を指定の縮小率でリサンプリング(sitk.Shrink
    • 変位場も同様にリサンプリング
    • FastSymmetricForcesDemonsRegistrationFilter を用いて変位場を更新
    • 更新された変位場を次のスケールにリサンプリングして引き継ぐ
  3. 最終変形の適用
    最終的に得られた変位場を用いて DisplacementFieldTransform を作成し、移動画像に対して位置合わせを行う。

特徴と利点

  • 粗いスケールから始めることで大きな構造の整合性を確保し、細かいスケールで微細な調整を行うため、局所的なノイズや誤差の影響を軽減できる。
  • 各スケールでの反復回数は、全体の反復回数に対して割合で指定されており、効率的な処理が可能である。
  • FastSymmetricForcesDemonsRegistrationFilter を使用することで、通常の Demons よりも高速かつ安定した変形推定が可能である。

仕組み - 品質の測定

このリポジトリに含まれる measure_quality.py は、指定フォルダー内の FITS/PNG 画像を一括で評価し、各画像ごとに数値化した品質指標を CSV に出力するとともに簡易的な可視化を行うツールです。

主要な品質指標

  • コントラスト (contrast) : 画像の最大値と最小値の差分。観測画像のダイナミックレンジの粗い指標として用います。
  • Laplacian 分散 (laplacian_variance) : 画像に対して OpenCV の cv2.Laplacian を適用し、その分布の分散を計算します。小さな構造(エッジ)の鋭さ、すなわちピントの良さの目安になります。
  • リム(輪郭)フィッティング残差 (rim_residual) : 画像から輪郭を抽出し、最も大きな輪郭点群に対して円フィットを行い、フィットの残差(RMS, ピクセル単位)を算出します。リムがきれいに出ているほど小さな値になります。
  • マルチスケールシャープネス (multiscale_sharpness) : マルチスケール(複数のガウシアン平滑化スケール)で Laplacian 応答を計算し、各スケールで高応答値(上位パーセンタイル)の平均を取り、最終的にスケール間で平均化したスコアです。高周波成分(エッジ)の強いフレームが高スコアになります。デフォルトでは上位10%を集計し、中心寄せのマスクで天体領域を重視します。

出力と挙動

  • CSV 出力列は filename, contrast, laplacian_variance, rim_residual, multiscale_sharpness です。
  • 輪郭抽出や円フィットが失敗した場合は rim_residual に空欄(空のセル)が出力されます。multiscale_sharpness が計算できない場合も同様に空欄になります。処理そのものが例外で失敗した場合は、その行の各値が空欄になることがあります。
  • GUI(横棒グラフ)では指標を切り替えて表示・ソートできます。選択した指標に有効なデータがない場合は GUI 上にその旨が表示されます。

前提・注意点

  • 実行には OpenCV (opencv-python) が必須です。FITS を扱う場合は astropy、PNG を扱う場合は Pillow が必要です。
  • リム残差の計算は輪郭検出と最小二乗フィットに依存するため、画像や前処理次第で有効な輪郭が得られないことがあります。必要に応じて前処理(平滑化、しきい値調整、ダウンサンプリング)を行ってください。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published