このページのコードが起動しませんでした。

index.htmlをフォルダから直接開くと、ブラウザがJavaScriptモジュールを読み込めません。そのため何枚かの写真を選んでも何も起きません。フォルダはhttpで配信してください。

powershell -ExecutionPolicy Bypass -File serve.ps1

そのうえでhttp://localhost:8080/を開いてください。

画像スタック|連写をまとめる、RAWも含めて

20枚を1枚に。20回のアップロードもRAW現像ソフトもなしで。

言語: 日本語
ソースを見る
写真はブラウザー内で処理されます。処理のためのアップロードはありません。

各フレームを開き、デコードし、位置を合わせ、合成し、書き出す処理は、すべて手元のブラウザが手元の端末で行います。60 MBのRAWファイル20枚はおよそ1ギガバイトの写真ですが、その1バイトも動きません。この道具にはネットワーク機能がそもそもなく、ファイルはアップロードせずローカルで処理するworkerがディスクから直接読みます。

いまの通信: 確認中…

オフライン: 確認中…

言葉を信じる必要はありません。開発者ツールを開き、ネットワークタブを見ながらRAWファイルの入ったフォルダをスタックしてみてください。写真もサムネイルもファイル名もカメラの機種も、運んでいるリクエストはひとつもありません。あるいは回線を切ってからスタックしてみてください。道具は何も変わりません。

1 フレームを選ぶ

RAWファイルは、カメラが埋め込んだJPEGプレビューのうち、使える最大のものを使用します。寸法は下に表示し、センサー画像より小さい場合もあります。センサーのデータはデコードしません。それが結果にとって何を意味するか

2 どうまとめるか

これを超えたら捨てる 小さくするほど多く捨てますし、本物の細部まで一緒に捨て始めます。標準偏差2つぶんがふつうの出発点です。

ピントの鋭さを測る範囲 大きくすると1枚のフレームから広い領域をまとめて取りますし、小さくすると細かい描写を追いますが、なめらかな背景がフレームのあいだで散らかることがあります。

1.00×

合成時に透明度は破棄されます。保存される画像はPNG形式でも不透明です。

3 スタックする

Markdownで表示

ブラウザで写真をスタックする方法

  1. フレームを選びます。連写、インターバル撮影、または使えるJPEGプレビューの入ったRAWファイルを選びます。ファイルが開き終わるまで待ってください。各行には見つかった内容を表示します。RAWならカメラと埋め込みプレビューの実際の寸法です。開けなかったファイルも一覧に残るので、除外されたものを確認できます。
  2. 何を失いたいのかに合う手法を選びます。ノイズには平均、ほかと異なる値を除外するならシグマクリッピングを使います。人や車、飛行機には中央値が向いていますが、画面の各部分に写る回数が全体の半分未満である必要があります。星の軌跡には比較明、フォーカスリングに沿って撮ったマクロには深度合成を使います。メニューの下には手法と限界を説明します。
  3. フレームの位置合わせが要るか決めます。まず自動を使ってください。平行移動・回転・拡大縮小を測定し、画像全体の信頼できる領域で一致が得られれば遠近も補正します。広い画角の星の写真に役立ちます。安定した連写なら平行移動だけにすると測定が少なく済みます。すでに位置が合っている場合や、空の動きを残す星の軌跡には「しない」を選んでください。固定した三脚でも星の位置はそろいません。各フレームは基準と表示したものと比較し、最初は1枚目が基準です。「これを基準にする」で一覧を並べ替えずに基準を変更できます。
  4. 4つの数字を読んでから、ボタンを押します。実行前に、予定の出力寸法、スタックの推定メモリ、スタック時の予定デコード回数、検査で読んだバイト数を表示します。ブラウザ内部やメモリ回収のために、モデル化したバッファ以上のメモリが必要な場合があります。この数字は計画であり総使用量の保証ではありません。帯に分ける必要があれば小さな作業解像度を提案します。実行後は基準と結果を実際の画素サイズで比べ、位置合わせの詳細を確認してからダウンロードしてください。

詳しい解説

ノイズを減らす、あるいは人を消すために写真をスタックする方法 スタックは連写した複数のフレームを1枚にまとめます。どの手法を使うかは、何を失いたいかによります。ノイズか、通行人か、マクロの浅い被写界深度か。それぞれの仕組みと費用、そしてRAWファイルがどこに収まるのか。

よくある質問

写真はどこかへアップロードされますか。

いいえ。各フレームを開き、デコードし、位置を合わせ、スタックし、書き出す処理は、すべて手元のブラウザが手元のハードウェアで行います。この道具にはネットワーク機能がそもそもなく、何かを取りに行くことも送ることもありません。ページのContent-Security-Policyには接続しうるアドレスがすべて書かれていますが、そのどれもこのサイトのものではありません。ページを一度読み込んで回線を切っても、そのまま動きます。ここでそれがほかの道具より効いてくるのは、単に量のせいです。RAWフレーム20枚はおよそ1ギガバイトで、その平均を取ってもらうために1ギガバイトの写真をアップロードすることこそ、この道具が避けるためにある事柄です。

どのRAW形式を読めますか。どうやって読むのですか。

CR2, CR3, NEF, NRW, ARW, SR2, SRF, DNG, ORF, RAF, RW2, PEF, SRW, 3FR, IIQ, DCR, KDC, MRW, MEF, RWLなどの形式に、使えるJPEGプレビューが入っていれば対応します。ファイルのディレクトリを調べ、見つかった最大のプレビューを使います。センサー画像より小さい場合も、プレビュー自体がない場合もあります。センサーのデータはデコードしません。画素はカメラのホワイトバランスとピクチャースタイルを反映した、各チャンネル8ビットの値です。一覧の寸法を確認してください。検査の読み取り量はヘッダーとディレクトリの分で、デコード時にはJPEGの部分も読みます。

ではなぜセンサーデータをきちんとデコードしないのですか。

センサーをデコードするには、カメラごとの圧縮方式に対応したLibRawやdcrawなどのRAWエンジンが必要です。埋め込みJPEGを使うことで道具を小さく保ち、ブラウザ自身の画像デコーダーを使えます。その代わり、カメラの描画とファイルに入っているプレビューの解像度を使います。RAW現像の設定を自分で選びたいときは、先に現像してJPEGかPNGで書き出し、ここでスタックしてください。

何枚まで、どのくらいの大きさまで扱えますか。

7つのうち6つの手法では、累算器のサイズはフレーム数が増えても変わりません。平均・比較明・比較暗・加算・深度合成は帯ごとに1回、シグマクリッピングは2回の処理が必要です。中央値は現在の帯について全フレームの値を持つため、フレーム数とともにメモリが増えます。どの手法も作業バッファが道具の予算を超えると帯に分割し、帯ごとにフレームを再デコードします。ページはバッファを見積もり、スタック時の予定デコード回数を表示します。検査と位置合わせにも処理が必要で、ブラウザのコーデックやGPUの内部で見積もり以上のメモリを使う場合があります。

フレームの位置合わせは実際に何をしているのですか。

各フレームの基準に対するずれを測り、1画素より細かい精度で位置を戻します。位相相関を使います。ずれは画像の周波数スペクトルの位相差に現れるので、画像ごとに1回のフーリエ変換で、200画素のずれも2画素のずれも同じように見つけられます。回転と拡大縮小はスペクトルを対数極座標で扱う同じ方法で求めます。自動では画像全体の領域も測定し、信頼できる測定が十分に一致すれば遠近を補正します。これにより、広い画角の星を中央だけでなく端でも位置合わせしやすくなります。追加の補正を確実に測定できない場合は回転と拡大縮小を維持し、位置合わせの詳細にその状態を表示します。補正はフレーム全体に適用するため、独立して動く被写体や、横に1歩移動して撮ったシーンのすべての奥行きは合わせられません。左に移動したフレームは右端まで届かなくなるため、結果は全フレームに共通する範囲に切り取られて少し小さくなります。これにより、覆われていない範囲の暗い縁を防ぎます。

どの手法を使えばいいですか。

動いたものがなくノイズを減らすなら平均です。独立したランダムノイズはフレーム数の平方根にほぼ比例して減ります。中央値は画面の各部分に全フレームの半分未満しか写っていないものを除きます。シグマクリッピングは平均に近い値だけを平均し、選んだしきい値の外にある値を除きます。枚数が少ない場合や頻繁に写る場合は動いたものが残ることがあるので、除去が最優先なら中央値が確実です。星の軌跡・花火・ライトペインティングには比較明、動いた明るいものを除くには比較暗です。加算はデコードしたフレームを加算合成します。8ビットの画像値で計算するため、カメラの露光時間を長くした状態は再現しません。フォーカスリングに沿って撮ったマクロには深度合成です。

RAWファイルは14ビットなのに、結果がなぜ8ビットなのですか。

RAWから使うのはカメラのJPEGプレビューで、出力も8ビットのPNGかJPEGです。平均とシグマクリッピングは広い累算器を使って最後に丸めるため、途中の計算を毎回丸めずに、ノイズのあるフレームからきれいな値を推定できます。保存した画像は各チャンネル8ビットのままで、線形のセンサーデータのビット深度やダイナミックレンジは得られません。

大きさの違うフレームや、別のカメラのフレームをスタックできますか。

できますが、意図した組み合わせか確認してください。最大のフレームが作業範囲を決め、ほかはそこに収まるよう拡大縮小して中央に置きます。保存する結果は全フレームに共通する範囲に切り取るため、形の違いや位置合わせによって予定の範囲より小さくなることがあります。カメラが違えば色の描画も混ざります。露出と構図を一定にし、基準との比較で結果を確認してください。

実行が帯に分かれると出ました。どういう意味ですか。

手法に必要な作業メモリが、道具が一度に確保したい量を超えるため、画像を横の帯に分けて1本ずつスタックします。位置合わせの形状とスタック手法は同じですが、ブラウザの再サンプリングで最下位ビットがわずかに違う場合があります。帯ごとに各フレームを読み直すため、時間は長くなります。予定のデコード回数はページに表示します。作業解像度を1段下げるとメモリは4分の1になり、ほとんどの場合は1回の処理にできます。対応する設定は注記に表示します。

ほかの道具はWorkerを使っていないのに、これだけ使うのはなぜですか。

処理が分単位で測られる唯一の道具だからです。ここのほかの道具は1、2秒で終わることをしていて、そこで処理をメインスレッドの外へ出すのは儀式にすぎません。大きなフレーム20枚をスタックするのは数百メガバイトにわたる密な計算で、メインスレッドではそれは固まったページを意味します。進捗バーは動かず、中止ボタンは応じず、しまいにはブラウザがタブを閉じようかと言ってきます。Workerはこの同じブラウザの中の2本目の流れで、この同じフォルダのファイルを、この同じポリシーの下で動かします。サーバーでもネットワーク機能でもありません。

無料ですか。アカウントは必要ですか。

無料で、アカウント、ログイン、試用期間、透かしはありません。サービスによる枚数やサイズの利用枠もありません。実際の限界は端末のメモリ、ブラウザのキャンバスとデコーダーの制限、処理時間です。このサイトは広告で運営しており、広告に写真の情報は渡しません。