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

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

> 連写した写真を1枚にまとめます。平均でノイズを消し、中央値で場面から人を消し、比較明で星の軌跡にし、あるいはマクロ撮影を深度合成します。CR2・NEF・ARW・DNG・RAF・CR3は、カメラ自身のプレビューを取り出して読みます。すべてブラウザの中で動きます。

これはhttps://abox.tools/ja/stack-images/にあるブラウザー用の対話型ツールです。ファイルはそのブラウザーを実行する端末上で処理します。意図した共有や任意の通信機能はページ内で説明します。以下は文章による説明です。利用するにはアドレスを開いてください。

## 写真は**ブラウザー内で処理**されます。処理のためのアップロードはありません。

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

- ✗ アップロードなし
- ✗ アカウント不要
- ✗ 透かしなし
- ✓ RAWを読む
- ✓ オフラインで動く
- ✓ オープンソース

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

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

## 詳しい解説

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

## 箱の中のほかのツール

- [画像黒塗りツール](https://abox.tools/ja/redact-image/): 隠した部分はファイルから消えます。上に置かれるのではありません。
- [EXIFビューアー・削除ツール](https://abox.tools/ja/exif-editor/): 写真が持ち主について語っていることを見て、それから外します。
- [DICOMビューア](https://abox.tools/ja/dicom-viewer/): CT・MRI・レントゲン・超音波を、ウィンドウとヘッダーと計測つきで。
- [画像→ICO変換ツール](https://abox.tools/ja/image-to-ico/): 画像を1枚入れれば、ブラウザもWindowsもMacも、求めるサイズがすべて出てきます。

## よくある質問

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

いいえ。各フレームを開き、デコードし、位置を合わせ、スタックし、書き出す処理は、すべて手元のブラウザが手元のハードウェアで行います。この道具にはネットワーク機能がそもそもなく、何かを取りに行くことも送ることもありません。ページの`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本目の流れで、この同じフォルダのファイルを、この同じポリシーの下で動かします。サーバーでもネットワーク機能でもありません。

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

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

## この主張を確かめる方法

- **処理はこのブラウザー内で行います。** 入力と結果はブラウザー内で処理し、処理コードはそれらを処理用にアップロードしません。Content-Security-Policyは資源と接続先を制限しますが、許可済みの相手はリクエストを受け取れます。内容は検査せず、何も送られないことを単独で証明しません。具体的な操作の要求とソースを比較するか、切断中にローカル操作を完了してください。
- **RAWプレビューはこの端末で読み取ります。** 多くのカメラRAWファイルには、カメラが生成したJPEGプレビューが入っています。この道具はファイルのディレクトリを調べ、使えるものの中から最大のプレビューを切り出します。検査時の読み取り量は、プレビューを見つけて調べるために読んだヘッダーとディレクトリの合計です。デコードではJPEGの部分も読み取ります。センサーのデータはデコードせず、一覧にはプレビューの実際の寸法を表示します。
- **処理はサーバーではなく、この端末のWorkerで動きます。** スタックは数分かかるため、Workerで計算し、ページの応答、進捗、取り消しを維持します。同じブラウザーの別スレッドで、`src/worker.js`にあります。ファイル参照はバイトをアップロードせずローカルで渡します。処理コードは端末上で読み、合成します。ページの接続先ポリシーをWorkerの経路の証明とせず、そのソースを確認してください。
- **この一組について、どこにも報告されません。** 何枚スタックしたか、どのカメラが書いたか、それぞれがどれだけずれていたか、どの手法を選んだか、どれだけ時間がかかったか。それらは閉じるまでこのページのメモリにあるだけです。このリポジトリにはその内容を運ぶ独自の分析イベントはありませんし、ダウンロードのあとにこのサイトが尋ねる唯一の質問は、親指の向きと道具の名前を送るだけで、ほかには何も送りません。
- **オフラインで動きます。** 回線を切っても道具は変わりません。もともとネットワークの段階がなかったからです。workerとそれが読み込むすべてのモジュールはこのページ自身のservice workerがキャッシュしているので、入れておいた写しは回線を抜いたままでもRAWファイルをスタックします。

**自分で確かめてください。**以上のどれも、鵜呑みにする必要はありません。このページは、リポジトリにあるテンプレートと設定から、誰でも読んで実行できるビルドスクリプトが生成しています。その結果は`dist`ブランチに置いてあるので、配信されているものと、ソースをビルドした結果とを差分で比べられます。 https://github.com/A-Box-of-Tools/website

まず読むとよいのは、Content-Security-Policyについては`config/site.toml`、センサーをデコードせずに埋め込みRAWプレビューを見つける仕組みは`src/raw.js`、各手法の計算は`src/stack.js`、推定作業メモリとスタック時の予定デコード回数は`src/plan.js`で確認できます。ブラウザ内部やメモリ回収のために、モデル化したバッファ以外のメモリが必要な場合があります。
