見出し画像

ATOM Cam動画からの低ノイズ静止画作成

ATOM Camの連続動画は圧縮率が高めで夜空など変化の少ない部分はブロックノイズが目立ちます。たとえばこんな感じです。

オリジナル画像(1フレーム切り出し)

星空撮影では複数枚撮影した画像の平均画像を作ることでノイズを低減することがよくやられています。ATOM Camの動画でもこれをやってみました。ここではffmpegImageMagickを使います(コマンドラインツールなので、いずれもターミナルを使います)。

基本的な考え方

ATOM Cam2の仕様は
 画角   :120度 = 8時間の星の動く角度に相当
 画像サイズ:1920 × 1080 ピクセル
なので、8 x 3600 ÷ 1920 = 15秒 / ピクセル

0.5ピクセルまでなら星がにじまないと考えると15 x 0.5 = 7.5秒間の平均画像まで大丈夫そうです。

mp4の動画ファイルの3秒目から7.5秒間のフレーム(113枚の静止画)を切り出すには下記のようにします。
ffmpeg -i [動画ファイル名] -ss 2 -q:v 1 -t 7.5 -f image2 "img_%03d.jpg"

次に切り出した静止画の平均画像を作るには下記のようにします。
convert "img_???.jpg" -evaluate-sequence Mean avg.jpg

得られた平均画像がこれです。上記の1フレームの画像に比べるとブロックノイズがかなり低減されています。

7.5秒の全フレームの平均画像

ATOM Cam2の動画の特徴

ATOM Camの動画を見ると1秒毎にブロックノイズの状態が変動しています。想像ですが、mpegのキーフレームが1秒ごとに切り替わっていたり、なんらかの画像処理が1秒ごとに行われていたりするのが原因かも知れません。

ならば1秒に1枚の代表画像を使った平均画像でも大丈夫なのでは?との仮説が立ちます。

mp4動画ファイルの3秒目から7.5秒について1秒に2枚静止画(15枚)を切り出して、平均画像を作ってみます。静止画の切り出し方法は下記です。
ffmpeg -i [動画ファイル名] -ss 3 -q:v 1 -t 7.5 -r 2 -f image2 "img_%03d.jpg"

1秒に1枚の代表画像で大丈夫との仮説を立てましたが、ブロックノイズの状態が同じの、ある1秒で2枚切り出し、次の1秒は切り出さないないことがあり、偏りが出るので1秒に2枚切り出しています。

するとこのような画像が得られました。7.5秒間の113フレームを使った時と同じくらいブロックノイズが低減できています。

7.5秒間で1秒に2枚ずつ切り出した平均画像

検証

0.5秒ごと7.5秒間の15枚はなくて、連続15枚でもノイズ低減できるか確かめてみます。mp4動画ファイルの3秒目から15フレームを切り出す方法は下記です。
ffmpeg -i [動画ファイル名] -ss 3 -q:v 1 -vframes 15 -f image2 "img_%03d.jpg"

結果はこのようになりました。オリジナルの1フレームとブロックノイズはほとんど変わっていません。「15枚の画像」を使うことが効果を生むのではなく、「7.5秒間の画像」を使うことが効果を生んでいるのが確かめられました。

まとめ

ATOM Camで撮影した連続動画をもとに7.5秒間の平均画像を作るとノイズを低減した静止画が生成できました。7.5秒間の全フレーム(113枚)を使っても構いませんが、0.5秒ごとに1枚(よって15枚)のフレームを使うだけでも同じくらいノイズが低減できました。枚数が少なければ処理時間も短くなるのでこの方が合理的だと思います。

注釈
2022/12/10に行われた「天リフ超会議」では「ATOM Cam2の対角画角が120度で6秒間、1秒に1枚」と説明しましたが、横の画角が120度が正しいらしいので7.5秒、キーフレームで切り替わったフレームでうまく切り出せないことがあったので1秒に2枚、と説明を変えています。


この記事が気に入ったらサポートをしてみませんか?