見出し画像

Pythonを使って星を数えてみよう

仕事終わりに夜空を眺めていると宇宙にはどれだけの星があるのかなって思うことはよくありますよね。

そこで今回はOpenCVと呼ばれる画像処理ライブラリを使いながらPythonで写真に写っている星を数えてみました。

↓作成したコードはQiitaで説明しています。

(練習)いちごの検出、カウント

いきなり星を数えるのは大変かなと思い、まずは肩慣らしに下の写真を使っていちごを数えてみることにしました。

画像1

はじめに今回カラーの情報は必要ありませんので、処理を効率よく行うために写真をグレースケール化して読み込みます。

グレースケール化とは赤・緑・青などの色の情報は持たずに明るさの度合いのみで表現することです。
※モノクロとは違います!

画像2

次にグレースケール化した写真をぼかします。
※なんで写真をぼかす必要があったかは後で説明します

画像3

ぼかした写真から輝度の閾値を自動で決め2値化を行い、下の写真のようにいちごと背景がわかりやすくなるよう白と黒で分けました。

画像4

最後に輪郭検出を行い、各輪郭の重心を求め座標としてリストに追加するようにします。
※(写真↓)検出した輪郭を元データの写真に描画しました

画像5

うまくいちごを検出し数えることが出来ました。

画像6

⚠注意
注1:写真をぼかすため隣同士が近すぎると誤検出する可能性がある
注2:物体の影が濃すぎても隣同士が近すぎると誤検出する可能性がある
注3:検出したいモノ以外が写っていると対象のカウントができない
注4:検出したいモノが重なっていてもカウントできない

(おまけ)いちご表面の光沢が背景と同じ色だったため、閾値処理をする前に画像をぼやけさせないと、うまく2値化することができず正しい輪郭を検出することができませんでした。

画像7

画像8

画像9

星空にチャレンジ(久留女木の棚田)

いちごが上手くいきましたのでそもそもの目的であった星空にもチャレンジしたいと思います。 

下の写真は以前、友人の一眼でとった星空です。まずはこの写真から星を検出しカウントできるかやってみました。

画像10

今回は写真をぼかす必要がありませんのでそのまま閾値処理で2値化して、、、 

画像11

画像12

雲が写り込んでいたのと左下の空が明るかったためにうまく2値化することが出来ませんでした。

人間だったら空の明るさとか雲とか無視して星を数えれるのに、、、(時間は無茶苦茶かかりますが)
※上の写真は検出した輪郭を緑の線で表示させています

星空に再チャレンジ(ケンタウルス座)

諦めきれなかったのでネットで条件に合う写真を見つけて再チャレンジしました。

下の写真はNASAが提供している著作権フリーの画像で他にも面白い写真がたくさんありますので興味のある方は是非見てみてください!

画像13

引用:https://www.nasa.gov/watchtheskies/new-nova-star-australia.html

これまでと同様の方法で星を検出、カウントできるかやってみました。

画像14

画像15

画像16

成功しました!!?(正解数がわからないのが残念です)

(おまけ)夜空の暗いところには星はないのか

このnoteで何回も星空の写真を見せられたために写真の中に星が写っていない真っ暗な部分が存在するけど、ここには星は存在しないの?と疑問を持つ方もいるかもしれません。

届く光が微弱すぎて検知できていないってことももちろんあると思いますが、たしかに宇宙には無限に星が存在するはずなのに空に暗闇があるのはおかしいですよね。

そのことについて散文詩「ユリイカ」(著者:ポー)にこんなことが書いてありました。

”星々の連なりが限りなく続くのであれば、空の背景は天の川に見られるように一様に輝いて見えるであろう。 その背後すべてにおいて星の存在しないところは一か所として存在しえないからである。 
したがって、こうした事態において、望遠鏡が無数の方向に見出す虚空を理解する唯一の方法は、見えない背景までの距離があまりに広大であるために、光線がそこからいまだ我々の元に届いていないのだと考えることであろう。”

簡単に言うと宇宙には時間が存在し始まりがあるから遠くで生まれた星の光はまだ届いていないよーってことだと思います。

こういった話大好きなのでもし他にもおもしろい話があったら教えてください。


この記事が気に入ったらサポートをしてみませんか?