MakeTimelapse は、JSol'Exの画像ファイルからタイムラプス動画を生成するツールです。
個人的に作成したツールですのでうまくいかない場合もご容赦ください。
特に生成に使用する画像の形式は限定されています。
- 画像の自動並び替え(タイムスタンプ順)
- 高品質なタイムラプス動画の生成
- シンプルなコマンドライン操作
- カスタマイズ可能なフレームレートと解像度
- Windows 11
- おそらく Linux でも実行可能
以下手順で実行環境を構築する
-
以下ソフトウェアを導入。環境変数PATHを通すこと。
- 必須
- python
- FFmpeg
- 任意
- PowerShell 7
- 必須
-
pythonのライブラリの導入
PS> pip install numpy astropy opencv-python SimpleITK scipy Pillow
-
スクリプトの展開
- スクリプトを 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 検証などで使用する一括処理用ツール
- Sol'Exで太陽を複数撮影
- 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
- Process Parameter
- 確認済みの主な条件
- make_timelapse.py を実行、複数の画像の位置合わせと動画の生成
- JSol'Ex で生成した画像から位置合わせに使用する基準画像を選択する。真円に近い、表面が緻密、歪みが少ない、などの条件に合う画像が望ましい。
- 画像サイズは一致しているのが望ましい。一致していない場合も処理はできるが、太陽のサイズが均一になるようにトリミングされているのがよい。
- 位置合わせが合わない場合、位置合わせ後の画像を入力として再度位置合わせを行うことも可
- make_timelapse.py のフロントエンドGUIの make_timelapse_gui.py の利用可
- (任意)gemerate_movie.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.py のフロントエンドとなる gui
- 画像(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値 1~50、デフォルト: 23)
--caption 各フレームの左下にファイル名を表示する
--caption_re PATTERN REPLACEMENT
ファイル名の置換(正規表現): PATTERN を REPLACEMENT に置換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 で中心マスクを使わない(デフォルトはマスクを使用)- このスクリプトは基本的に使用しない。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)を更新することで、ノイズの影響を抑えつつ、より滑らかで正確な位置合わせを実現する。
-
初期変位場の作成
基準画像(fixed)と同じサイズ・情報を持つ初期の変位場(initial_field)を作成する。これは後の各スケールでの変形のベースとなる。 -
スケールごとの処理
以下の3段階の縮小率(shrink factor)で画像を処理する:- 4倍縮小(粗いスケール)
- 2倍縮小(中間スケール)
- 元のサイズ(細かいスケール)
各スケールでは以下の処理を行う:
- 基準画像と移動画像を指定の縮小率でリサンプリング(
sitk.Shrink) - 変位場も同様にリサンプリング
FastSymmetricForcesDemonsRegistrationFilterを用いて変位場を更新- 更新された変位場を次のスケールにリサンプリングして引き継ぐ
-
最終変形の適用
最終的に得られた変位場を用いて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が必要です。 - リム残差の計算は輪郭検出と最小二乗フィットに依存するため、画像や前処理次第で有効な輪郭が得られないことがあります。必要に応じて前処理(平滑化、しきい値調整、ダウンサンプリング)を行ってください。