乱数と1ピクセルで写真を撮る方法(ゴーストイメージングへの招待)
はじめに
カメラといえば一度シャッターを切れば日常の一部を画像として保存することができます。これは撮像(イメージング)と呼びます。一般的にカメラは光を受ける箇所が二次元的に配置されているため、画像情報としてメモリに納めることができるわけですが、この受光箇所が一つしかなかったらどうでしょうか?二次元的な空間の広がりを持たないので画像として参照するのは困難なように見えます。しかしそれを実現するのがゴーストイメージングという技術です。
ゴーストイメージング
先ほど紹介した各受光箇所はピクセルといい、これは画像のピクセルにそのまま対応します。ゴーストイメージング(Ghost Imaging)は乱数を通じて生成された0と1の"パターン"を次々に撮像対象に照射、その光を1ピクセルの受光素子でキャッチします。キャッチした情報をもとにPC上で撮像対象を再構成していきます。
シミュレーション結果ではありますが、GIという文字がイメージングできていく様子を見てみましょう。
number of patternsは照射したパターンの枚数を表しています。パターンの枚数を増やしていけばいくほどGIという文字が浮かび上がっていくのが分かります。
ゴーストイメージングの原理
実はパターンを照射して受光素子で光をキャッチする一連の流れは統計学で使われる相関を計算していることと同じです。受光素子に入射する光からはそのエネルギーとして光強度と呼ばれる量が取得できます。この光強度がパターンと撮像対象の相関を表しており、この相関が大きければ大きいほど撮像対象はそのパターンをより多く含んでいると捉えることができます。[1]
照射したパターンは予め分かっているものと仮定し、次の図のような計算をPC内で実行すればGIという文字が浮かび上がってきそうです。
つまりパターン自体に光強度(相関)をかけ合わせることで、より撮像対象に似ているパターンを優先的に主張させられるので撮像対象が再構成できるということです。本記事ではこの計算を再構成計算と呼ぶことにします。
相関とは?
上で説明した原理の部分を数式で確認してみましょう。相関とは異なる二つのデータがどれだけ似ているかを表す指標で、似ていれば似ているほど大きな値を取るものです。数式で表すとこんな感じです。
これは相関の中でも相関係数と呼ばれるもので-1から1の範囲を取るものです[2]。ここで新たにデータ列を
と置いて、
を定義しましょう。これはベクトル
一旦離散的なデータを扱ってきましたが空間という連続なものを考えるならば、二次元の場合ベクトルではなく
同じ二次元座標同士の積の積分で定義されます。
ゴーストイメージングによる相関計算
受光素子に光が入射するとその光のエネルギーとして光強度が取得できます。とある二次元上の点
この光を受光素子でキャッチすることを考えます。
このとき光を受け取る領域(開口)を
で計算されます。次に撮像対象にパターンを通過させる部分に注目します。
ここで撮像対象を
と単純に掛け算した結果になります[3]。これは撮像対象にパターンを作用させると言います。そのままこの光が受光素子に入射したならば受光素子上で得られる全光強度
となります[4]。ここでパターンが0か1の値をもつことから
再構成計算
そのまま一番最初に紹介した再構成計算を数式で記述します。再構成結果を
で書けます。ここで
ここで再構成されるのは
とはいえ再構成結果が正しいかどうか判別するには
と置きましょう。ここで
ここで
縦軸:MSE、横軸:照射したパターン枚数
パターンを照射すれば照射するほど精度高く再構成できるようになることが確認できました![6]
もっと良い再構成方法
これまでゴーストイメージングにおける一連の流れを説明しました。しかし再構成をするのに10万枚もパターンを使ってられません。一般的なゴーストイメージングにおいて実は先ほど紹介した再構成計算を使われるのは稀です。結論から言うとよく使われるのは次の方法です。
ここで
であり、
はじめに紹介したものと同じ10万枚照射していますが明瞭な像が得られていますね。ついでにMSEも見ておきましょう。
青:アンサンブル平均なし(上)、オレンジ:アンサンブル平均あり(下)
明らかに少ないパターン枚数で高い精度を叩き出しているのが分かります。そもそもこの再構成計算は何をしているのでしょうか?まず
ここで
で整理できます。つまり平均からの強度とパターンの値の偏差
なぜ1ピクセルで受光する必要があるのか?
これまでイメージングできなかったものがイメージングできるようになるかもしれないからです。
一般的にカメラとして挙げられる受光素子はCCDカメラやCMOSカメラと呼ばれるものです。これらが受光部分が二次元的に配列しているわけですが、受光部分がたった一つであってもイメージングできるようになれば、様々な受光素子を使うことができるようになり、これまでのカメラが取得できなかった波長帯や分解能でイメージングできるようになるはずです。
また乱数を使うとノイズ耐性のあるイメージングができるようになるとのことです。ノイズというと機器的なノイズや空間上のノイズなど様々挙げられますが、ノイズ自体が重ね合わせていくと軽減することと乱数がノイズを受けても乱数としての性質を保つことを考えれば、確かにノイズ耐性のあるイメージングができるようになりそうです。
ただゴーストイメージングには欠点があります。うすうす気づいているかと思いますがパターンを何度も照射しなければならないということです。
ゴーストイメージングに限らず1ピクセルでイメージングする技術は、必ず複数回のパターンの照射が必要になります。このパターンの照射をできるだけ減らすために圧縮センシングや深層学習などを組み合わせて、できるだけパターン照射の回数を減らす努力がなされています。
シミュレーション用ソースコード
パッと見何をしているかわかりづらくてスイマセン(´・ω・`)今回の記事の結果は以下のコードで実施しました。実行する際は自己責任でお願いします。main関数内のパラメータを変化させれば様々実験できます。本ソースコードは次の環境で実施しました。
- OS: Windows 11
- Python: 3.9.13
- matplotlib: 3.6.3
- numpy: 1.24.1
- Pillow: 9.4.0
参考文献
公益社団法人 精密工学会 Precipedia「ゴーストイメージング」http://precipedia.jspe.or.jp/wiki/index.php?title=ゴーストイメージング
-
後で示しますが正確には撮像対象の強度情報との相関です。 ↩︎
-
前提としてデータ
と\{a_{i}\}_{i\in\mathbb{N}} は平均値が0であることを要求します。 ↩︎\{b_{i}\}_{i\in\mathbb{N}} -
この掛け算が成り立つためには撮像対象が十分薄いことを仮定します。厚い物体の場合は原子核物理学などで使われる散乱問題として定式化する必要があります。ボルン近似ってやつですね。 ↩︎
-
本当はいろいろ突っ込みどころがあります。本来光は波なので空間中を回折しながら進みます。つまりパターンはパターンのまま撮像対象に伝搬するわけはでないし、撮像対象を通過した後も通過した直後の光がそのまま受光素子に届くわけではありません。ただレンズなどの光学素子を使えばうまくパターンのまま伝搬させることができます(4f光学系など)。撮像対象を通過した後も同様です。ここは簡単のためにそのような仮定があることに注意してください。 ↩︎
-
実は
自身を取得する技術もあります。それがホログラフィです。受光素子から光強度が得られると説明しましたが、この光強度に波の干渉を反映することでうまい具合にt 自身を観測できるようになります。このとき画像ではなく立体的に情報を認識できるようになります。 ↩︎t -
撮像対象と直接比較できるように
を0から1に正規化して評価しています。 ↩︎\tilde{t}
Discussion