ねこふくろうのメモ置き場
記事一覧に戻る

TITLE:東京の夜空を眺める 2/2

公開日:2026/2/16

導入

個人情報ですが私は東京に住んでいます。
東京の星空にはどんなイメージがあるでしょうか。
町明かりで星が全然見えない。明るい星はちょっと見える。そもそも興味ない。住んでる場所や生活スタイルによって様々あると思います。

私は星を見るのが好きなので近くの広場で星をながめることが多々あります。
好きが高じてカメラを買いました。

今回はその写真で遊ぼうと思います。
この記事は前回の記事の続きです。
今回は100枚の画像を合成する事によりノイズを除去して鮮明な画像を生成します。

本文

前回のあらすじ

画像の中から星を検知するアルゴリズム作成しました。

画像合成のアルゴリズム

画像を重ね合わせてノイズを除去する処理のフローチャートは以下のようになります。
fig-1: 画像の合成アルゴリズム
fig-1: 画像の合成アルゴリズム

これによりカメラのノイズが取り除かれた画像を取得できます。

アルゴリズムの実現方法


2つの画像から同じ星の対応をとる方法

まず、2つの画像には撮影時間が異なることにより画像をそのまま重ねると星の位置がずれてしまうため画像の中の星の位置をそろえる必要があります。
そのためにまず、2つの画像から同じ星の対応をとる必要があります。
 2つの画像の星が同じ星であると満たすパターンは図1のような場合です。
図1: 同じ星と判定パターン(1)
図1: 同じ星と判定パターン(1)
基準画像の星の近くに比較画像の星が1つしかない場合その2つの星は同じ星であると判定します。
 次にそれ以外の場合について説明します。
図1以外の場合は星の対応が取れないため、その後の処理から除外します。
パターンとしては図2、図3、図4の3つになります。
図2: 同じ星と判定しないパターン(1)
図2: 同じ星と判定しないパターン(1)
図3: 同じ星と判定しないパターン(2)
図3: 同じ星と判定しないパターン(2)
図4: 同じ星と判定しないパターン(3)
図4: 同じ星と判定しないパターン(3)
図2、3、4は画像間で対応した星が不明のため以降の処理からは省きます。

対応する星が重なるように合成する画像を変形する

結論から書くと比較画像の星の座標を基準画像の対応する星の座標に一致するように、3x3の行列を利用してアフィン変換をおこないます。
以下はアフィン変換の説明であるため、すでにご存知の方は次の「実際に画像を合成する」まで飛ばしてください。

アフィン変換とは
アフィン変換とはn次元(画像の場合は2次元)のある座標ppを拡大、縮小、回転、せん断、鏡映、平行移動することで別の座標pp'へ移す変換のことを言います。
アフィン変換は行列で表現することができます。
2次元のアフィン変換の変換行列をAAとするとAAは以下のように表せます。
(a11a12a13a21a22a23001) \begin{pmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ 0 & 0 & 1 \end{pmatrix}
アフィン変換は以下の式によって行われます。
(p11p211)=A(p11p211) \begin{pmatrix} p'_{11} \\ p'_{21} \\ 1 \\ \end{pmatrix} = A \begin{pmatrix} p_{11} \\ p_{21} \\ 1 \end{pmatrix}
画像が2次元行列であるのにも関わらず行列が3次行列である理由は逆行列を計算するために必要だからです。
アフィン変換AAの逆行列A1A^{-1}もアフィン変換となります。
(p11p211)=A1A(p11p211)=A1(p11p211) \begin{pmatrix} p_{11} \\ p_{21} \\ 1 \\ \end{pmatrix} = A^{-1}A \begin{pmatrix} p_{11} \\ p_{21} \\ 1 \end{pmatrix} = A^{-1} \begin{pmatrix} p'_{11} \\ p'_{21} \\ 1 \end{pmatrix}
であるため、A1A^{-1}pp'ppに戻す変換行列になります。
具体例をお見せします。
A=(1/21/21/21/21/21/2001) A = \begin{pmatrix} 1/\sqrt{2} & -1/\sqrt{2} & 1/2 \\ 1/\sqrt{2} & 1/\sqrt{2} & -1/2 \\ 0 & 0 & 1 \end{pmatrix}
p=(201) p = \begin{pmatrix} 2 \\ 0 \\ 1 \end{pmatrix}
とします。
計算すると
p=(1/21/211/21/21001)(201)=(2+1211) p' = \begin{pmatrix} 1/\sqrt{2} & -1/\sqrt{2} & 1 \\ 1/\sqrt{2} & 1/\sqrt{2} & -1 \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} 2 \\ 0 \\ 1 \end{pmatrix} = \begin{pmatrix} \sqrt2+1 \\ \sqrt2-1 \\ 1 \end{pmatrix}
つまり、(2,0)(2, 0)は変換行列AAによって(2+1,21)(\sqrt2+1, \sqrt2-1)に移動されます。
次に逆行列は
A1=(1/21/211/21/21001) A^{-1} = \begin{pmatrix} 1/\sqrt{2} & 1/\sqrt{2} & -1 \\ -1/\sqrt{2} & 1/\sqrt{2} & 1 \\ 0 & 0 & 1 \end{pmatrix}
であり、
p=(1/21/211/21/21001)(2+1211)=(201) p = \begin{pmatrix} 1/\sqrt{2} & 1/\sqrt{2} & -1 \\ -1/\sqrt{2} & 1/\sqrt{2} & 1 \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} \sqrt2+1 \\ \sqrt2-1 \\ 1 \end{pmatrix} = \begin{pmatrix} 2 \\ 0 \\ 1 \end{pmatrix}
となり、もとの座標に戻ることを確かめられます。

参考:アフィン変換 - Kanazawa Institute of Technology - 金沢工業大学

 比較画像の星の座標を基準画像の星の座標へ移動するためのパラメータを求めます。
ただし移動後の座標がすべて一致する行列はおそらく見つからないため移動後の座標と基準となる星の座標の誤差の和が最も小さくなるような行列を求めます。


実際に画像を合成する


元にした画像は以下のような画像です。
このようにノイズが多い画像を100枚用意しました。
図5:元画像1
図5:元画像1
図5:元画像2
図5:元画像2
図5:元画像3
図5:元画像3
図5:元画像4
図5:元画像4

合成結果は以下のようになります。
図6:合成画像
図6:合成画像

この画像からアンドロメダ銀河とM31が映っていることが分かりました。
図7:合成画像
図7:合成画像

最後に

いかがでしたでしょうか。
2つの銀河が映っているとは思わなかったのでM32には驚きました。

個人的に星空の写真の合成が気に入ったのでギャラリーとして特別ページをつくりたいと思いました。

また、新しく星空を撮影したらその期にギャラリーページを作成します。
楽しみにしてもらえると幸いです。

記事一覧に戻る