写真の物理学 ㉙ ノイズの物理学

Share
📐
写真の物理学シリーズ ㉙
このシリーズでは、写真にまつわる現象を物理学の言葉で記述する。「なんとなくそうなる」を「なぜそうなるか」に変換することが目的である。

写真のノイズはISO感度やセンサーサイズと結びつけて語られるが、その物理的起源を定量的に理解している人は少ない。ノイズの正体は光の量子性が生むショットノイズ、半導体の熱ゆらぎによる暗電流、読み出し回路の電気的雑音であり、いずれも統計物理の言葉で記述できる。本稿ではこれらのノイズ源を導出し、SNR・ISO感度・センサーサイズとの定量的関係を明らかにする。

ショットノイズ:光の量子性が生むゆらぎ

ノイズの中で最も根源的なものが、ショットノイズ(光子ショットノイズ)である。これは光そのものの性質に由来するため、いかなるセンサー技術でも原理的に除去できない。

光は光子(フォトン)という離散的な粒子として検出される。ある露光時間の間にセンサーの1ピクセルに到達する光子の数は、平均値のまわりに統計的なばらつきを持つ。この到着過程はポアソン過程に従う。

ポアソン分布の重要な性質は、分散が平均値に等しいことである。平均光子数を $N$ とすると、

$$ \text{分散} = \sigma^2 = N $$

したがって、標準偏差(ノイズの大きさ)は

$$ \sigma = \sqrt{N} $$

これがショットノイズの基本式である。平均100個の光子が到達するピクセルでは、標準偏差は $\sqrt{100} = 10$ 個。つまり、ある露光では90個、別の露光では110個という具合に、$\pm 10$ 個程度のゆらぎが生じる。

このゆらぎは光の量子性そのものから来ているため、センサーの性能とは無関係に存在する。完璧なセンサーを作ったとしても、ショットノイズだけは残る。目を閉じたときに見える灰色のゆらぎが視細胞の熱ノイズに由来するように、光を検出する装置がある限り、ノイズはゼロにならない。

信号対雑音比(SNR)の導出

ノイズそのものの大きさよりも重要なのは、信号に対するノイズの割合である。これを信号対雑音比(Signal-to-Noise Ratio、SNR)と呼ぶ。

ショットノイズが支配的な条件(十分な光量がある場合)では、信号は平均光子数 $N$、ノイズは $\sqrt{N}$ であるから、

$$ \text{SNR} = \frac{N}{\sqrt{N}} = \sqrt{N} $$

この式は極めて重要な意味を持つ。SNRは光子数の平方根に比例する。光量を4倍にすれば、SNRは2倍になる。つまり、ノイズの「目立ちやすさ」を半分にするには、4倍の光が必要である。

たとえば、あるピクセルに平均10,000個の光子が到達する場合、ショットノイズは $\sqrt{10000} = 100$ 個、SNRは $100$ となる。信号の1%がノイズということになる。一方、平均100個しか到達しない暗部では、ショットノイズは $\sqrt{100} = 10$ 個、SNRは $10$ にすぎない。信号の10%がノイズだ。

写真の暗部にノイズが目立つ理由は、ここにある。暗い部分は光子数が少なく、SNRが低い。これは感覚的な話ではなく、ポアソン統計の必然的な帰結である。

読み出しノイズ:電子回路の熱雑音

センサーが光子を受け取り、光電変換によって電子に変換した後、その電荷をアナログ信号として読み出し、デジタル値に変換する過程がある。この読み出し回路で発生するのが読み出しノイズ(リードノイズ)である。

読み出しノイズの物理的起源は、電子回路を構成する抵抗やトランジスタにおける熱雑音(ジョンソン・ナイキストノイズ)である。導体内の自由電子は温度に応じた熱運動をしており、この運動が微小な電圧ゆらぎを生む。熱雑音の二乗平均電圧は、

$$ \langle V^2 \rangle = 4 k_B T R \Delta f $$

で与えられる。ここで $k_B$ はボルツマン定数、$T$ は絶対温度、$R$ は抵抗値、$\Delta f$ は帯域幅である。

読み出しノイズの重要な特徴は、光の量に依存しないことである。信号がゼロであっても、読み出し回路を動作させるだけで一定量のノイズが発生する。このため、読み出しノイズは暗部の画質に決定的な影響を与える。

現代のCMOSセンサーでは、読み出しノイズは数電子($e^-$)程度にまで低減されている。裏面照射型(BSI)CMOSセンサーの登場や回路設計の進歩により、10年前のセンサーと比較して読み出しノイズは大幅に改善された。

暗電流ノイズ:温度が支配する熱励起

シャッターを閉じた状態でも、センサーの各ピクセルは微弱な電荷を蓄積する。これが暗電流(ダークカレント)であり、半導体中の電子が熱エネルギーによって価電子帯から伝導帯へ励起される現象に由来する。

暗電流の温度依存性は、アレニウスの式と類似した指数関数的な関係に従う。

$$ I_{\text{dark}} \propto T^{3/2} \exp\left(-\frac{E_g}{2 k_B T}\right) $$

ここで $E_g$ はシリコンのバンドギャップエネルギー(約1.12 eV)、$T$ は絶対温度である。指数関数の中にバンドギャップの半分 $E_g / 2$ が現れるのは、空乏領域における生成電流が支配的な温度域では、電子・正孔対の生成がバンドギャップの中間準位を介して起こるためである。

この指数関数的な依存性は極めて強力で、実用上の目安として、センサー温度が約5~8℃上昇するごとに暗電流は約2倍になる。天体写真で冷却CCDが用いられる理由は、まさにこの温度依存性を利用して暗電流を劇的に抑制するためである。

暗電流もまた、光子の到着と同様にランダムな事象であるため、ポアソン統計に従う。露光時間 $t$ の間に蓄積される暗電流電子の平均数を $D$ とすると、暗電流ノイズは

$$ \sigma_{\text{dark}} = \sqrt{D} $$

となる。$D$ は温度と露光時間の両方に依存するため、高温環境での長時間露光では暗電流ノイズが支配的になりうる。

固定パターンノイズ:画素間のばらつき

ここまでのノイズはすべて時間的にランダムなゆらぎであった。固定パターンノイズ(FPN: Fixed Pattern Noise)はそれらと性質が異なり、フレームごとに変化しない空間的なばらつきである。

固定パターンノイズには2種類ある。

DSNU(Dark Signal Non-Uniformity) は、暗電流の画素間ばらつきである。半導体の結晶構造中の欠陥や不純物の分布が画素ごとに異なるため、暗電流の大きさもピクセルごとに異なる。これは信号レベルに依存しない固定的なオフセットとして現れる。

PRNU(Photo Response Non-Uniformity) は、光に対する感度の画素間ばらつきである。各ピクセルのマイクロレンズの形状、フォトダイオードの面積、量子効率のわずかな違いに起因する。PRNUは信号に比例するため、明るい部分ほど影響が大きくなる。PRNUの典型的な値は、信号の0.5~2%程度である。

固定パターンノイズはフレームごとに変化しないため、ダークフレーム減算やフラットフィールド補正によって効果的に除去できる。天体写真における「ダーク補正」や「フラット補正」は、まさにこのノイズ源への対処である。

全ノイズの合成

センサーで発生する各ノイズ源は互いに独立であるため、全ノイズは各成分の二乗和の平方根(RSS: Root Sum of Squares)で合成される。

$$ \sigma_{\text{total}} = \sqrt{\sigma_{\text{shot}}^2 + \sigma_{\text{read}}^2 + \sigma_{\text{dark}}^2} $$

固定パターンノイズはカメラ内部の補正処理やソフトウェアで除去されるのが一般的であるため、ここでは時間的にランダムなノイズのみを扱っている。

各項を光子数で書き下すと、

$$ \sigma_{\text{total}} = \sqrt{N + \sigma_{\text{read}}^2 + D} $$

ここで $N$ は信号光子数(光電変換後の電子数)、$\sigma_{\text{read}}$ は読み出しノイズ(電子数換算)、$D$ は暗電流電子数である。

この式から、撮影条件によって支配的なノイズ源が変わることがわかる。

十分な光量がある条件では $N$ が大きいため、$\sigma_{\text{total}} \approx \sqrt{N}$ となり、ショットノイズが支配的になる。暗所や短時間露光では $N$ が小さくなり、$\sigma_{\text{read}}$ が相対的に大きくなって読み出しノイズが支配的になる。長時間露光で温度が高い場合は $D$ が増大し、暗電流ノイズが支配的になる。

ISO感度の物理的意味

ISO感度の設定がノイズに与える影響を理解するには、アナログゲインとデジタルゲインを区別する必要がある。

アナログゲイン は、光電変換で得られた電荷をアナログ・デジタル変換器(ADC)に渡す前に増幅する処理である。アナログ増幅は信号と読み出しノイズの両方を増幅するが、ADCの量子化ノイズに対しては信号を持ち上げる効果がある。つまり、ADCの分解能を有効に使い切るために、アナログゲインは有用である。

デジタルゲイン は、ADCで量子化された後のデジタル値を単純に乗算する処理である。信号もノイズも同じ倍率で増幅されるため、SNRは一切改善しない。

ISO感度を上げると、多くのカメラではまずアナログゲインが段階的に上がり、ある閾値を超えるとデジタルゲインが適用される。いずれの場合も、増幅されるのはセンサーが受け取った光子数に基づく信号であり、光子数そのものが増えるわけではない。

ISO感度を上げるとノイズが増えて見える理由は、正確に言えば「ノイズが増える」のではなく「少ない光子数で得た低SNRの信号を引き伸ばしている」からである。同じ被写体を同じ明るさに撮影する場合、ISO 3200ではISO 100に対して5段分短い露光で済む代わりに、センサーが受け取る光子数は1/32になる。ショットノイズ支配域のSNRは $\sqrt{N}$ に比例するため、光子数が1/32になればSNRは $1/\sqrt{32} \approx 1/5.7$ に低下する。

ゲインはこのSNRの低い信号を目に見える明るさまで持ち上げているにすぎない。

センサーサイズとノイズの関係

「大きいセンサーはノイズが少ない」という経験則は、画素面積と光子収集量の関係から定量的に説明できる。

同じ画角で同じ被写体を同じ露出設定で撮影する場合を考える。レンズの焦点距離はセンサーサイズに比例して選ぶことになるが、重要なのはセンサー全体が受け取る総光子数である。

センサー面積を $A_{\text{sensor}}$ とすると、同じ被写体を同じ明るさで撮影した場合、センサーに到達する総光子数は面積に比例する。

$$ N_{\text{total}} \propto A_{\text{sensor}} $$

これは、面光源を撮影する際にレンズが集める光束が立体角と視野面積の積で決まるのと同じ物理的構造に基づいている。

画素数が同じであれば、1ピクセルあたりの面積は $A_{\text{pixel}} \propto A_{\text{sensor}}$ となり、1ピクセルあたりの光子数も

$$ N_{\text{pixel}} \propto A_{\text{pixel}} $$

に比例する。ショットノイズ支配域でのSNRは

$$ \text{SNR} = \sqrt{N_{\text{pixel}}} \propto \sqrt{A_{\text{pixel}}} $$

であるから、画素面積が4倍になればSNRは2倍になる。

フルサイズセンサー(約36mm × 24mm)とAPS-Cセンサー(約23.5mm × 15.6mm)の面積比は約2.3倍。画素数が同じであれば、1ピクセルあたりのSNR差は $\sqrt{2.3} \approx 1.5$ 倍、すなわち約0.6段分の差に相当する。

ただし、これはあくまで同一の撮影条件(同じF値、同じシャッター速度)での比較である。実際の撮影ではレンズの選択や撮影距離が異なるため、単純な面積比だけで画質差を論じることはできない。センサーサイズの議論は、光学系全体を含めた総合的な視点が必要である。

ソフトウェアノイズリダクションの信号処理的基礎

カメラ内やRAW現像ソフトのノイズリダクション(NR)は、空間フィルタリングの原理に基づいている。

最も単純なノイズリダクションは、周辺ピクセルの値を平均化する空間ローパスフィルタである。$n \times n$ の範囲で平均化すると、ランダムノイズの標準偏差は $1/\sqrt{n^2} = 1/n$ に減少する。ノイズが $1/n$ になるなら素晴らしいことに思えるが、代償がある。信号のエッジやディテールも同様にぼやけてしまう。

この「ノイズ除去」と「ディテール保存」のトレードオフが、ノイズリダクション技術の本質的な課題である。

現代のノイズリダクション手法は、このトレードオフに対処するため、エッジ保存型のフィルタリングを採用している。代表的なものとして、以下の手法がある。

バイラテラルフィルタ は、空間的な距離だけでなく輝度値の類似度にも基づいて重みを決定するフィルタである。輝度が大きく異なるピクセル(エッジの向こう側)には小さな重みを、輝度が類似するピクセル(同一領域内)には大きな重みを与える。これにより、エッジを越えた平均化を抑制しつつ、平坦な領域のノイズを効果的に除去する。

非局所平均(NLM: Non-Local Means) は、ピクセル単位ではなく、パッチ(小さなブロック)単位でテクスチャの類似性を評価する。画像内の離れた位置にあっても、パターンが類似する領域同士を平均化する。局所的なフィルタよりも効果的にノイズを除去できるが、計算コストが高い。

ウェーブレット変換に基づく手法 は、画像を周波数帯域ごとに分解し、各帯域で適応的にノイズを除去する。ノイズは主に高周波帯域に集中するため、高周波成分を選択的に抑制することで、低周波のトーンやグラデーションを保持したままノイズを低減できる。JPEGの圧縮がDCT(離散コサイン変換)で周波数領域に変換してから高周波成分を量子化するのと、発想の根底は共通している。

近年ではディープラーニングに基づくノイズリダクションが急速に進歩しており、従来の信号処理的手法を凌駕する性能を見せている。しかし、その内部で学習されているのは、結局のところ「何が信号で何がノイズか」を統計的に判別するモデルであり、基本原理はエッジ保存フィルタリングの延長線上にある。

まとめ

写真のノイズには明確な物理的起源がある。ショットノイズは光の量子性から、読み出しノイズは電子回路の熱雑音から、暗電流ノイズは半導体の熱励起から生じる。これらは互いに独立であるため、二乗和の平方根で合成される。

SNRが光子数の平方根に比例するという関係は、ISO感度とノイズの関係、センサーサイズとノイズの関係を統一的に説明する。ISO感度を上げてノイズが増えるのは、少ない光子数で得た信号を増幅しているからであり、大きいセンサーでノイズが少ないのは、より多くの光子を集められるからである。

ノイズは写真の敵のように扱われがちだが、その正体は物理法則そのものである。光が量子であること、電子が熱運動すること、半導体に有限のバンドギャップがあること。ノイズを理解することは、カメラが光をどのように捉えているかを理解することと同義である。

Read more

Dependabotの対応が面倒なのでRenovateを導入する

Dependabotくんはある程度の依存関係の更新を通知してくれるが、山のようにprojectを抱えているとなんとも痒いところに手が届かない。 ということで、Renovateを使ってみる。 Build software better, togetherGitHub is where people build software. More than 150 million people use GitHub to discover, fork, and contribute to over 420 million projects.GitHub ここからGitHub Appを入れる。 あとは、指示に従ってポチポチするだけで、超かんたんだった。 感想 自動化最高。

By Sakashita Yasunobu

nodejsのバグを見つけたのでPRを投げてみた

概要 要するに、node --testで特定のバイナリを標準出力に書くと、テストランナーが固まったり、異常終了したりするバグです。 バグ自体は既知のものだったようで、修正がされていました。 test_runner: infinite loop in FileTest#drainRawBuffer when child stdout contains FF 0F followed by large size bytes · Issue #62693 · nodejs/nodeVersion v25.9.0 (also reproduced on v24.14.1 LTS, v22.21.0 LTS, v23.4.0) Platform Darwin 25.

By Sakashita Yasunobu
青空文庫のParser

青空文庫のParser

青空文庫のParserを作ってます。 GitHub - P4suta/aozora: Pure-functional Rust parser for 青空文庫記法 (Aozora Bunko notation): ルビ, 傍点, 縦中横, 外字, 返り点, indent containers, page breaks.Pure-functional Rust parser for 青空文庫記法 (Aozora Bunko notation): ルビ, 傍点, 縦中横, 外字, 返り点, indent containers, page breaks. - P4suta/aozoraGitHubP4suta Rustで作ってますが、配布物はcargoのほかにnpm/pypiでも入手できます Documentation * Playground — try it in

By Sakashita Yasunobu