Как посчитать количество звёзд на фото? / Хабр
Всем привет!
Недавно я участвовал в олимпиаде по искусственному интеллекту на Python и там было много интересных задач, но самая интересная это про звезды на небе: «Дано фото звездного неба с земли. Задача: определить количество звёзд на небе»
Вроде бы не сложно, если фотка только со звездами, например:
Фото только со звёздами
Ладно, тут все легко! Это можно решить так:
Импортируем библиотеки
from scipy.spatial import distance from skimage import io from skimage.feature import blob_dog, blob_log, blob_doh from skimage.color import rgb2gray import matplotlib.pyplot as plt
Я буду использовать библиотеку skimage
для работы с изображением, scipy
— для сложных математических вычислений и matplotlib.pyplot
для отладочного вывода.
image = io.imread(input("Путь до изображения: ")) image_gray = rgb2gray(image)
Откроем изображение и преобразуем его в черно белое для его простоты его будущей обработки.
Чтобы разобраться как мы упростили представление изображения, возьмем первый пиксель в RGB и GrayScale:
print(image[0, 0]) print(image_gray[0, 0])
И получим:
[24 16 14] #RGB 0.06884627450980392 #GrayScale
работать с float проще чем с кортежем
Далее нам нужно определиться, как искать звезды. К счастью, в модуле skimage
есть функция определения капель(blobs). Их три вида:
Laplacian of Gaussian (LoG)
Difference of Gaussian (DoG)
Determinant of Hessian (DoH)
Подробнее о их различиях можно прочитать тут.
На личном опыте и сравнивая результаты я пришел к выводу, что для данной задачи я буду использовать с такими параметрами.
blobs_log = blob_log(image_gray, max_sigma=20, num_sigma=10, threshold=.05)
Далее я отмечаю точки на картинке и считаю их количество
fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.set_title('Laplacian of Gaussian') ax. imshow(image) c_stars = 0 for blob in blobs_log: y, x, r = blob if r > 2: continue ax.add_patch(plt.Circle((x, y), r, color='purple', linewidth=2, fill=False)) c_stars += 1 print("Количество звёзд: " + str(c_stars)) ax.set_axis_off() plt.tight_layout() plt.show()
Запуская, я получаю такой результат:
Количество звёзд: 353
Вывод программы
Но верно ли отработает программа, если ввести ей картинку, которая соответствует условию задачи.
Картинка, соответствующая задачи
И мы получим много ложных точек.
Поэтому нужно улучшить алгоритм поиска точек. Для этого воспользуемся еще одной фишкой библиотеки skimage
это сегментация изображения.
Вот ссылка на источник, где описывается основы сегментации изображения.
Взяв от туда нужный кусок кода, мы улучшаем нынешний алгоритм.
Импортируем новые модули:
from skimage.segmentation import slic, mark_boundaries import numpy as np from sklearn.cluster import KMeans
Сегментируем изображение с помощью функции slic
segments = slic(img, start_label=0, n_segments=200, compactness=20) segments_ids = np. unique(segments) print(segments_ids) # centers centers = np.array([np.mean(np.nonzero(segments == i), axis=1) for i in segments_ids]) print(centers) vs_right = np.vstack([segments[:, :-1].ravel(), segments[:, 1:].ravel()]) vs_below = np.vstack([segments[:-1, :].ravel(), segments[1:, :].ravel()]) bneighbors = np.unique(np.hstack([vs_right, vs_below]), axis=1) fig = plt.figure(figsize=(10, 10)) ax = fig.add_subplot(111) plt.imshow(mark_boundaries(img, segments)) plt.scatter(centers[:, 1], centers[:, 0], c='y') for i in range(bneighbors.shape[1]): y0, x0 = centers[bneighbors[0, i]] y1, x1 = centers[bneighbors[1, i]] l = Line2D([x0, x1], [y0, y1], alpha=0.5) ax.add_line(l)
Сегментация изображения
Создаём словарь, для определения к какому сегменту относится каждый пиксель.
dict_seg = {} for i in range(img.shape[0]): for j in range(img.shape[1]): seg = segments[i, j] if seg not in dict_seg.keys(): dict_seg[seg] = [img[i, j]] continue dict_seg[seg]. append(img[i, j])
Высчитываем средний цвет у каждого сегмента
def middle(a, b): color = [] for i, j in zip(a, b): color.append((i + j) // 2) return color for k, v in dict_seg.items(): # вычисляем перцентиль для выброса пересвеченных пикселей в сегменте p = int(0.9 * len(v)) v = sorted(list(v), key=lambda x: my_distance(x, white)) s = [0, 0, 0] for c in v: s[0] += c[0] s[1] += c[1] s[2] += c[2] s[0] //= len(v[:p]) s[1] //= len(v[:p]) s[2] //= len(v[:p]) dict_seg[k] = s
На выходе получаем словарь со средними цветами в каждом сегменте
>>> {0: [5, 3, 14], 1: [5, 3, 16], 2: [7, 4, 17] ... 190: [23, 19, 37]}
Далее кластеризуем словарь dict_seg
с помощью KMeans
из библиотеки sklearn
kmeans = KMeans(n_clusters=3, algorithm="elkan") kmeans.fit(list(dict_seg.values())) labels, counts = np.unique(kmeans.labels_, return_counts=True)
Создаем новый словарь вида {segment: claster_num(их всего 3)}
dic_seg_claster = {} for key, value in dict_seg. items(): dic_seg_claster[key] = kmeans.predict([value])[0] max_l = max(dic_seg_claster.values(), key=lambda x: list(dic_seg_claster.values()).count(x))
Находим максимально частый кластер на картинке
Далее идет наш предыдущий код, но с некоторыми изменениями:
blobs_log = blob_log(image_gray, max_sigma=30, num_sigma=10, threshold=.05) fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ... for blob in blobs_log: y, x, r = blob # новый фрагмент if dic_seg_claster[segments[int(y), int(x)]] == max_l: c = plt.Circle((x, y), r, color='purple', linewidth=2, fill=False) count += 1 ax.add_patch(c) ...
И уже получаем результат получше.
1418 звезд
Высчитав статистическую вероятность, пришел к выводу, что погрешности на лишних объектах компенсируют невыделенные звезды.
Этот алгоритм ещё можно долго улучшать, подстраивать количество сегментов и кластеров. Но на данный момент я приостановлюсь.
Все ваши пожелания или негодования оставляйте а комментариях, мне будет очень интересно прочитать их, для того чтобы улучшить мой алгоритм до идеального состояния)
Готовый проект можно найти в gitHub
Спасибо за внимание!
какого числа, во сколько начнется и где будет виден
Персеиды – метеорный поток, появляющийся на небосводе ежегодно в июле-августе. Это название возникло потому, что метеоры формируются в созвездии Персея.
Звездопад Персеиды – древнее явление. Уже в древних китайских летописях содержатся упоминания о Персеидах. В VIII-IX веках об этом звездопаде регулярно упоминают в китайских, корейских и японских исторических документах. В Италии этот звездопад получил красочное название «Слезы святого Лаврентия», поскольку 10 августа празднуется день этого святого, тогда же и наблюдается пик Персеид.
Какого числа и во сколько начнется звездопад Персеиды
Первые редкие метеоры появляются 17 июля, последние вспыхнут 24 августа: небесная река широка. Максимальная интенсивность потока приходится в ночь с 12 на 13 августа. В это время количество светящихся метеоров может быть и 100, и даже 150. Увеличение и уменьшение числа падающих «звезд» происходит постепенно. В первые и последние дни звездопада обычно сгорают 1-2 «звезды» в час.
Метеоры летят со скоростью около 210 тысяч километров в час и начинают загораться на высоте в 70 километрах над Землей. Метеоры, летящие к нам со скоростью 210 тысяч километров в час, начинают загораться на высоте примерно в 70 километрах над Землей. Некоторые – наиболее крупные – будут падать несколько секунд, оставляя в небе яркие струйки. Можно успеть загадать какое-нибудь коротенькое желание. Вроде «Замуж!», «Денег!», «Будем здоровы!» Или даже «Мир во всем мире!»
Радиант метеорного потока Персеиды. Фото: Московский Планетарий
Бывалые наблюдатели справедливо рекомендуют любоваться звездопадами за городом – там, где небо темнее. Телескоп или бинокль не понадобятся – метеоры хорошо видны невооруженным глазом.
Одновременно с Персеидами к нам иногда залетают и Каприкорниды. Но эти падающие «звезды» легко отличить друг от друга. Персеиды, как правило, белые. Каприкорниды – оранжевые и желтые.
СПРАВКА «КП»
Комета Свифта-Туттля была открыта в 1862 году. Период ее обращения 135 лет. Последний раз ее видели в 1992 году. В 2126 году комета вернется и приблизится к нашей планете на 23 миллиона километров, а в 4479 году — на 4,5 миллионов километров. Землян, если они останутся, ждут красочные зрелища. Ведь комета — огромна. Ее ядро достигает 26 километров в диаметре. Этим, кстати, и объясняется то, что комета Свифта-Туттля оставляет столь насыщенный частичками шлейф. От большого «корабля» — больше «грязи».
Астрономы НАСА уверяют, что, начиная с 2008 года, количество метеоров, выпавших на Землю из хвоста кометы, увеличивается. Поэтому не исключено, что нынешние наблюдения станут весьма плодотворными, а звездопад — действительно красочным.
Официальным первооткрывателем Персеид считается бельгиец Адольф Кетеле — математик, астроном, метеоролог, социолог, один из родоначальников научной статистики. Он публично привлек внимание к красочному зрелищу в августе 1835 года. Однако о том, что Персеиды существуют, знали еще древние китайцы — упоминали об этом метеорном потоке в своих летописях в 36 году до нашей эры.
Где и когда наблюдать
Лучше всего начинать следить за падающими Персеидами с 11 часов вечера по местному времени, обратив взор на северо-восток. Интенсивность потока постепенно нарастает после полуночи, достигая своего максимума примерно в 4.30 утра.
Созвездие Персея располагается в северной части неба. Чтобы облегчить поиски, нужно искать созвездие Кассиопеи, которое по форме напоминает букву «W». Чуть левее и ниже будет созвездие Персея.
Наблюдению за звездопадом препятствует свет полной Луны, который приглушает огоньки падающих «звезд». Но условия должны быть отменные, поскольку Луна уйдет с неба уже в 10 часов вечера. Помешать наблюдению за падающими Персеидами могут только облака.
Где и когда наблюдать звездопад Персеиды. Фото: kp.ru
Астрологическое значение Персеид
Уже в древности регулярному появлению звездных потоков придавалось мистическое значение. Наши предки советовали загадывать желание на падающую звезду, тогда оно обязательно сбудется. Часто так и происходило. Поэтому и сегодня многие загадывают желания, даже люди с высшим образованием.
Сохранилась традиция в ночь с 12 на 13 августа заряжать положительной энергией различные продукты. Особенно полезно в этот день готовить блюда из овощей, фруктов, злаков и меда. Этот день очень подходит для различных духовных практик и медитации.
Астрологи утверждают, что звездопад несет с собой поток энергии. В созвездии Персея, по мнению эзотериков, происходит соперничество между Светом и Тьмой, поэтому поток энергии Персеид обладает противоречивой природой. Некоторые люди начнут бороться за справедливость, другие встанут на защиту собственных интересов. В период звездопада особенно рекомендуется отказаться от агрессивных действий, проявлять терпимость к родным и близким и сострадание к окружающим.
Метеор потока Персеиды, который как-то в августе сфотографировал астронавт Рон Гаран (Ron Garan) с борта Международной космической станции (МКС). Фото: pixabay.com
Мнение эксперта
Андрей Найденов, преподаватель физики и математики в онлайн-школе TutorOnline:
– Падающие звезды – одно из красивейших явлений природы. Загадывать желания на падающую звезду – одно из старинных поверий. При этом падающая звезда может быть одна-единственная на весь ночной небосвод. А если таких звезд падает по 50 и более за один час? Представляете, сколько желаний можно загадать за одну ночь? По этой или другой причине, но наблюдение за падающими в большом количестве звездами с некоторых пор становится экстравагантным развлечением для многих жителей планеты Земля.
Конечно, мы знаем, что наблюдаем не падение звезд, а падение метеоров – мелких осколков космических объектов, которые собраны в огромные облака, несущиеся с бешеной скоростью по своим, достаточно хорошо известным астрономам орбитам. Научное название этого явления – метеорные потоки. Когда траектории движения Земли и метеорных потоков пересекаются в пространстве, многочисленные космические камни на огромной скорости врезаются в атмосферу нашей планеты и сгорают, нагреваясь до высокой температуры в верхних ее слоях.
Звездопад Персеиды в августе 2022 года должен порадовать и астрономов, и любителей этого прекрасного зрелища. В этом году пик ожидается с 12 по 13 августа. При этом фаза Луны будет находиться между новолунием и первой четвертью. Это сделает ее влияние на освещение неба минимальным. Этот «звездопад» можно будет наблюдать на протяжении всей ночи. Причем пик придется на предрассветные часы.
Этот метеорный поток связывают с кометой Свифта-Таттла. Его радиант, то есть место на небе, кажущееся источником метеорного потока, находится в созвездии Персея.
Валентин Кожешкурт, старший методист Домашней школы «ИнтернетУрок» по физико-математическому направлению:
– Звездопад мы наблюдаем, когда Земля входит в область метеорного роя – множества осколков, которые остались после полного или частичного разрушения кометы. Эти осколки попадают в атмосферу Земли и, сгорая в ней, вызывают вспышку – ее мы и видим как «падающую звезду».
Одна из таких комет – комета Свифта-Таттла. Эта комета, как и другие, движется вокруг Солнца по очень вытянутой траектории и приближается к Солнцу (а значит, и к Земле) один раз в более чем 130 лет. Но след из небольших осколков, который она оставляет за собой, – метеорный рой – так и остается вблизи ее траектории.
Каждый год в августе Земля возвращается в эту область, вращаясь вокруг Солнца, и мы наблюдаем в это время звездопад Персеиды. Понятно, что область метеорного роя очень размыта, поэтому нет четкого момента начала и конца звездопада, когда Земля входит в метеорный рой и выходит из него.
Звездопад Персеиды длится около месяца с постепенно нарастающей и убывающей интенсивностью, поэтому говорить о датах можно лишь условно. Обычно внимание акцентируют на дне, когда интенсивность звездопада максимальна – 12 августа.
30 000+ Картинки Луна и Звезды
30 000+ Картинки Луна И Звезды | Скачать бесплатные изображения на Unsplash
- A Photophotos 10k
- А. Изображения и изображения продуктов питания
чашка чая
цветной фон
изображения и изображения луны
the moon
full moon
Hd sky wallpapers
Galaxy images & pictures
Cool backgrounds
outdoors
horizontal
lighting equipment
Moon images & pictures
Star images
universe
whidbey island
вашингтон
сша
ночь
дерево картинки и картинки
голубое небо
HD обои
индия
Kanpur
Деревные изображения и картинки
Mountians
Banff
Dusk
Градиент Фоны
LONE
Хэллоуин изображения и картин ––– –––– – –––– ––––– –– – –– –––– – – –– ––– –– –––– – –.
Серые обои Hd
Закат изображения и картинки
Восход солнца
Природа изображения
Outer space pictures
astronomy
aboveclouds
Hd orange wallpapers
crescentmoon
Hd wallpapers
Hq background images
photoshop background
Hd blue wallpapers
Light backgrounds
nightsky
group of objects
развитие
обучение
ночная съемка
полнолуние
облака и изображения
космические изображения и изображения
Австрия
Vienna
HD Night Sky Walpapers
Starry Night
Starry Sky
Связанные коллекции
Moon and Stars
157 Фотографии · Cudated By Drie Wickline
9050 157. Хизер Бриггс
Луна и звезды
138 фото · Куратор: Abbie SuiteR
Изображения и фотографии еды
чашка чая
цветной фон
Hd sky wallpapers
Galaxy images & pictures
Cool backgrounds
outdoors
horizontal
lighting equipment
whidbey island
washington
usa
Hd wallpapers
india
kanpur
Tree images & pictures
mountians
banff
Хэллоуин картинки и картинки
Осень картинки и картинки
Облака картинки и картинки
Hd grey wallpapers
Sunset images & pictures
sunrise
aboveclouds
Hd orange wallpapers
crescentmoon
Hd wallpapers
Hq background images
photoshop background
night
Tree images & pictures
bluesky
Космические картинки и картинки
австрия
вена
Hd обои ночного неба
звездная ночь
звездное небо
–––– –––– –––– – –––– – –––– –– – –– –––– – – –– ––– –– –––– – –.
Moon Images & Pictures
The Moon
Полнолуние
Природные изображения
Overse Space Pictures
Астрономия
Moon Images & Pictures
Звездные изображения
Universe
HD Blue Wallpaper nightsky
Похожие коллекции
Луна и звезды
157 Фотографии · Куратор Drew Wickline
Moon & Stars
127 Фотографии · Куратор Heather Briggs
Moon and Stars
138 Фотографии · Куратор Abbie Suiter
Группа объектов
Development
Группа объектов
разработка
.
полнолуние
Облака и изображения
сумерки
Градиентные фоны
одиночество
Логотип Unsplash
Unsplash+В сотрудничестве с Getty Images
UNSPLASH+
разблокировать
Food Images & Pictures
чайная чашка
Цветные фоны
Lucasvphotos
HD Серые обои
Sunset Images & Pictures
Sunrise
–– –– ––––––––––––––––––––– – – –––– – –––– –– – –– –––– – – –– ––– –– –––– – –.
Джош Миллер
Луна картинки и картинки
луна
полнолуние
LucasVphotos
Природа фото
Overt Space Pictures
Астрономия
Nick Owuor (Astro.nic.visuals)
HD Sky Walpapers
Galaxy Изображения и картин logo
Unsplash+В сотрудничестве с Getty Images
Unsplash+
Unlock
на улице
горизонтально
осветительное оборудование
Tim Sessinghaus
Hd wallpapers
Hq background images
photoshop background
Ignacio M.
Moon images & pictures
Star images
universe
Chad Peltola
whidbey island
washington
usa
Aron Visuals
Hd синие обои
Светлые фоны
ночное небо
Aron Visuals
ночь
Изображения деревьев
bluesky
Unsplash logo
Unsplash+In collaboration with Getty Images
Unsplash+
Unlock
group of objects
development
learning
Madhuvan Yadav
Hd wallpapers
india
kanpur
Aron Visuals
ночная съемка
полнолуние
облака и изображения
Адриан Суонкар
космические изображения и изображения
австрия
Vienna
Roberto Nickson
Изображения деревьев и картин
Hd обои ночного неба
звездная ночь
звездное небо
Altınay Dinç
Хэллоуин картинки и картинки
Fall изображения и изображения
Изображения и изображения облаков
Просматривайте изображения премиум-класса на iStock | Скидка 20% на iStock
Unsplash logo
Сделайте что-нибудь потрясающее
Лучшие изображения Moon Stars [HD]
Лучшие изображения Moon Stars [HD] | Download Free Images on Unsplash
- Фото в рамкеФото 10k
- Стопка фотографийКоллекции 10k
- Группа людейПользователи 0
природа
на улице
вселенная
outer space
astronomy
wallpaper
background
orion constellation
Texture backgrounds
Hd pattern wallpapers
Nature images
Outer space pictures
Hd purple wallpapers
Hd wallpapers
Hq background images
Hq background images
Hd серые обои
astronomy
nighttime
bali
Пейзаж images & images
indonesia
Hd blue wallpapers
Light backgrounds
nightsky
Hd black wallpapers
nighty
deepblue
les baux
france
midnight
Space images & pictures
crater
Hdr photos & изображения
–––– –––– –––– – –––– – –––– –– – –– –––– – – –– ––– –– –––– – –.
лунные изображения и картинки
луна
полная луна
Hd sky wallpapers
Galaxy images & pictures
solar system
aboveclouds
Hd orange wallpapers
crescentmoon
Food images & pictures
tea cup
colored background
night
Sunset images & pictures
восход солнца
лунные изображения и изображения
звездные изображения
вселенная
на открытом воздухе
горизонтальное
осветительное оборудование
Star Images
HD Обои
IRAN
Изображения дерева и картин · Куратор Хизер Бриггс
Луна и звезды
138 фотографий · Куратор Abbie SuiteR
группа объектов
разработка
обучение
Maharashtra
Mumbai
Индия
Orion Constellation
Фоны текстур
HD Photle Walpaper
Пейзажные изображения и картины
Индонезия
На открытом воздухе
Горизонтальное
Осветительное оборудование
Star images
Hd wallpapers
iran
group of objects
development
learning
maharashtra
mumbai
india
Moon images & pictures
the moon
full moon
aboveclouds
Hd оранжевые обои
crescentmoon
Еда изображения и картинки
чашка чая
цветной фон
Hd синие обои
Светлые фоны
nightsky
Hd чёрные обои
nighty
deepblue
Изображения деревьев
bluesky
фотография –––– –– – –– –––– – – –– ––– –– –––– – –.
Hd обои небо
Галактика фото и картинки
Солнечная система
Природа фото
Космос фото
Hd фиолетовые обои
ночь
Sunset images & pictures
sunrise
Moon images & pictures
Star images
universe
Related collections
Moon and stars
157 photos · Curated by Drew Wickline
Moon & Stars
127 photos · Куратор Хизер Бриггс
Луна и звезды
138 фотографий · Куратор Abbie SuiteR
les baux
Франция
полночь
Космические снимки и картинки
crater
Hdr photos & images
Unsplash logo
Unsplash+In collaboration with Jacob Dyer
Unsplash+
Unlock
orion constellation
Texture backgrounds
Hd pattern wallpapers
Josh Miller
Moon images & pictures
луна
полная луна
–––– –––– –––– – –––– – –––– –– – –– –––– – – –– ––– –– – ––– – –.