見出し画像

Pythonを使って星を数えてみた

OpenCVという画像処理ライブラリを使って、Pythonで写真に写っている星を数えてみました。

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


いちごの検出、カウント

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

画像1

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

グレースケール化とは、赤・緑・青などの色の情報を持たずに、明るさの度合いのみで表現することです。

画像2

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

画像3

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

画像4

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

画像5

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

画像6

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

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

画像7
画像8
画像9

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

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

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

画像10

今回は写真をぼかす必要がないため、そのまま閾値処理で二値化しましたが、、、

画像11
画像12

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

人間なら空の明るさや雲を無視して星を数えることができるのに、、、(時間は非常にかかりますが)
※上の写真は検出した輪郭を緑の線で表示させてます

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

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

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

画像13

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

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

画像14
画像15
画像16

今度こそ成功した気がします!笑

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