以下の内容はhttps://rna.hatenablog.com/entry/20240915/1726401870より取得しました。


木星タイムラプス (2024/9/12)

9月12日深夜に撮った木星の写真からタイムラプス動画を作ると言っていましたが、

やっとできました。約40分間撮影したものを144倍速の16秒の動画にしてあります。手違いで動画のアスペクト比が変ですが…

木星タイムラプス (2024/9/13 1:01-2:40, 144倍速)
木星タイムラプス (2024/9/13 1:01-2:40, 144倍速)
高橋 ミューロン180C (D180mm f2160mm F12 反射), AstroStreet GSO 2インチ2X EDレンズマルチバロー (合成F41.4), ZWO IR/UVカットフィルター 1.25", ZWO ADC 1.25" / Vixen SX2 / L:ZWO ASI290MM (Gain 329) RGB:ZWO ASI290MC (Gain 395), SharpCap 4.1.11817.0 / 露出: L:10ms x 1500/3000 をスタック処理 x 5 を de-rotation, RGB:12.5ms x 1500/3000 をスタック処理 x 4 を de-rotation して LRGB 合成 / AutoStakkert!4 4.0.11, WinJUPOS 12.3.11, RegiStax 6.1.0.8, ffmpeg 4.4.2

木星が自転して、イオの公転するだけで、大赤斑も写っていない地味な動画ですが…

木星の向こう側を通過していたイオは、撮影直後に木星の右端から顔を出してきました。画像処理の関係で動画では少し不自然になっていますが… 木星の左側の縁の二重化もさすがに全フレームに適切な処理を加えるのは困難なのでそのままにしてあります。

木星とイオの構図が初めて作った木星タイムラプスとほとんど同じですが、画像処理が洗練した分今回の方が綺麗に見える、かな?


画像処理

動画のフレームの元になる画像の処理は以下の手順で行いました。

  • AutoStakkert!4 で各撮影動画(SERファイル)のスタック済画像を作成
  • RegiStax 6 でスタック済画像に軽めの wavelet 処理をかける
  • WinJUPOS でスタック済画像の image measurement を行う
  • WinJUPOS で L, RGB それぞれの wavelet 処理画像を de-rotation する
    • reference time を 0.1 分ずつずらして中間フレーム用の画像も生成する
  • RegiStax 6 で de-rotation 済画像に強めの wavelet 処理をかける
    • L 画像には強めの、RGB 画像にはそれより弱めの wavelet をかける

これで L, RGB 各389フレームの画像ができました。RegiStax 6 の処理は MACRO/batch ツールで自動処理しましたが、WinJUPOS の reference time ずらし de-rotation は手動です… これなんとかならないかなぁ。

最初のスタック、wavelet、image measurement は撮影動画の本数(今回は39本)だけですが、パラメータ調整の試行錯誤等があるので半日くらいはつぶれる感じです。ただ、ここは静止画として仕上げるベストショットを選ぶためにも必要な作業なのでタイムラプス作成と関係なく必要な作業。

動画のフレーム生成のための作業は合計778フレーム分を処理しなくてはならないので大変ですが、バッチ処理できる RegiStax 6 の wavelet 処理は寝てる間とかテレビ見てる間とかに実行していたのでどうということはありませんでした。合計すると8時間くらいかかっていましたが。

問題は WinJUPOS の reference time ずらし de-rotation です。これは大半が単純作業なので、YouTube で推しの劇団のゆるい雑談配信を聴きながらとか、ソシャゲのストーリーのムービーを流しながらとか*1 「ながら作業」でなんとかこなしました。L, RGB 合わせて4時間くらいかかったと思います。

動画作成

最初にタイムラプスを作ったときは各フレームを静止画と同じように Photoshop で処理していましたが、これは細かいレタッチが可能な利点はあるものの、フレーム数が増えると頭がおかしくなるのでやめました。今は ffmpeg のフィルターだけでなんとかしています。

まず L, RGB それぞれのロスレス動画(Jupiter-20240913-L.mov と Jupiter-20240913-RGB.mov)を生成します。

ffmpeg -framerate 24 -pattern_type glob -i 'L/*.png' -vf 'crop=h=768:y=256' -an -vcodec mjpeg -qscale 0 Jupiter-20240913-L.mov
ffmpeg -framerate 24 -pattern_type glob -i 'RGB/*.png' -vf 'crop=h=768:y=256' -an -vcodec mjpeg -qscale 0 Jupiter-20240913-RGB.mov

オプションの意味は以下の通りです。

  • -framerate 24 : 出力動画のフレームレートを 24fps に指定しています。
  • -pattern_type glob -i 'L/*.png' : L フォルダの png 画像を全部入力フレームにしています。
    • 画像の並び順はファイル名でソートした順です。ファイル名に固定桁数のタイムスタンプを含めていたのでそのまま正しい順番になりました。
  • -vf 'crop=h=768:y=256' : 入力画像のクロッピング指定です。1280x1280 の画像を 1280x768 にクロッピングしました。*2
  • -an : 出力動画に音声を含めないことを指定しています。
  • -vcodec mjpeg : 動画形式に Motion JPEG を指定しています。
  • -qscale 0 : JPEGの品質を指定しています。mjpeg コーデックなら 0 でロスレスJPEGになるそうです。ただし、入力の色深度は 48bit ですが出力の色深度は 24bit (YUV444)になるので、色や階調の精度は落ちます。

これをLRGB合成して画質調整を加えて動画サイト等に投稿可能な形式に変換します。

ffmpeg -i Jupiter-20240913-RGB.mov -i Jupiter-20240913-L.mov -filter_complex '[0:v]format=yuv444p[0v];[1:v]format=yuv444p[1v];[0v][1v]mergeplanes=0x100102:yuv444p[2v];[2v]colorlevels=rimin=0.087:gimin=0.087:bimin=0.087:rimax=0.666:gimax=0.678:bimax=0.673,eq=saturation=1.17,cas=strength=0.7' -pix_fmt yuv420p -c:v 'libx264' -an -b:v 8M Jupiter-20240913-LRGB.mp4

オプションの意味は以下の通りです。

  • -i Jupiter-20240913-RGB.mov : 上で作成したRGB動画を1つ目(0番)の入力として指定しています。
  • -i Jupiter-20240913-L.mov : 上で作成したL動画を2つ目(1番)の入力として指定しています。
  • -filter_complex ... : LRGB合成と画質調整(レベル、彩度、シャープネス)です(後述)
  • -pix_fmt yuv420p : 出力ピクセル形式に動画サイト等に投稿可能な一般的な形式(yuv420p)を指定しています。
  • -c:v 'libx264' : 動画形式に h264 を指定しています。
  • -an : 出力動画に音声を含めないことを指定しています。
  • -b:v 8M : ビットレートに 8Mbps を指定しています。

オプション -filter_complex の中身は複数のフィルターが指定されていてややこしいですが、各フィルターは「;」で区切られています。それぞれ以下のような意味です。

  • [0:v]format=yuv444p[0v] : 0番の入力(ここではRGB動画)の映像のピクセル形式を yuv444p に変換したものに「0v」の名前を付けます。*3
  • [1:v]format=yuv444p[1v] : 1番の入力(ここではL動画)の映像のピクセル形式を yuv444p に変換したものに「1v」の名前を付けます。
  • [0v][1v]mergeplanes=0x100102:yuv444p[2v] : チャンネル合成を行います。映像 0v をフィルターへの0番の入力、映像 1v を1番の入力とします。フィルターの出力映像に 2v の名前を付けます。
    • 0x100102 : チャンネル合成パターンの指定で、x の後ろの6桁の数字の2桁ずつが以下のような意味になっています。
      • 10 (1,2桁目) : 1番の入力のYチャンネル(輝度信号)を出力のYチャンネルにします(L動画の輝度が出力動画の輝度になる)。
      • 01 (3,4桁目) : 0番の入力のUチャンネル(色差信号その1)を出力のUチャンネルにします(RGB動画の色が出力動画の色に反映される)。
      • 02 (5,6桁目) : 0番の入力のVチャンネル(色差信号その2)を出力のUチャンネルにします(RGB動画の色が出力動画の色に反映される)。
    • yuv444p : 出力映像のピクセル形式に yuv444p を指定しています。
  • [2v]colorlevels=rimin=0.087:gimin=0.087:bimin=0.087:rimax=0.666:gimax=0.678:bimax=0.673,eq=saturation=1.17,cas=strength=0.7 : 映像 2v に対して複数のフィルターで画質調整を行っています。
    • colorlevels=rimin=0.087:gimin=0.087:bimin=0.087:rimax=0.666:gimax=0.678:bimax=0.673 : RGBの各チャンネルに対するレベル補正です。カラーバランスの調整も(無理やり?)行っています。
      • rimin=0.087 : 入力のRチャンネルのシャドウ部をクリッピングしています(Photoshop のレベル補正の左側のスライダーを右に少し寄せた感じ)。
      • gimin=0.087 : 入力のGチャンネルのシャドウ部を(以下略)
      • bimin=0.087 : 入力のBチャンネルのシャドウ部を(以下略)
      • rimax=0.666 : 入力のRチャンネルのハイライト部をクリッピングしています(Photoshop のレベル補正の右側のスライダーを左に寄せた感じ)。
      • gimax=0.678 : 入力のGチャンネルのハイライト部を(以下略)
      • bimax=0.673 : 入力のBチャンネルのハイライト部を(以下略)
    • eq=saturation=1.17 : 彩度を少し盛っています。
    • cas=strength=0.7 : Contrast Adaptive Sharpen フィルターでシャープネスをだいぶ盛っています(Camera Raw や Lightroom のテクスチャとか明瞭度に相当?)。

というわけで、だいぶ試行錯誤しましたが、一度パラメータを決めてしまえばフレーム数に関わらず ffmpeg コマンド一発で調整できるので便利です。8bit/チャンネルの精度でしか調整できないのですが、最終的には YUV420 で出力されてさらに精度が落ちるのであまり問題にはならないかと思います。

*1:画面が Live 2D の紙芝居で見なくてもほぼ大丈夫なやつでした。

*2:本当は 1280x720 か 1024x768 にするつもりだったのですが、誤って変なアスペクト比になってしまいました…

*3:今回は入力が yuv444p なのでこのフィルターと次のフィルターは省略できるかも?




以上の内容はhttps://rna.hatenablog.com/entry/20240915/1726401870より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14