@imlynn

Как подсчитать количество звезд на ночном небе?

У меня есть фото ночного неба:

b5d6534eec26456fb7ef1930890de920.jpg

Программа оставляет на фото только те области, которые соответствуют определенному порогу, и так мы сможем определить все звезды на фото.
Пусть следующее изображение является примером работы этой программы и оно удовлетворяет всем нашим требованиям (на самом деле нет, но не в этом суть):

fd33ee0274904edabdf7f23c862c2398.png

Теперь нам надо определить, сколько же звезд есть на этом фото и их размер, при этом игнорируя различные помехи.
Изображение закодировано в один долгий однострочный массив, где белые области отвечают "1", а черные - "0" (с ним мы и должны работать), но есть также функция, которая возвращает значение цвета определенного пикселя из него (пусть это будет выглядеть так: pick(x,y) == 0 или 1).

Размер звезды - диаметр наложенного не нее круга. Т.е. для звезды с одной точкою размер равен 1, если это квадрат 2на2 - то 2, если это крест 3на3 - то 3 и так далее.

На фото есть звезды, которые на изображении показаны прямой линией. Да, это не координаты круга, но если линия меньше 3 пикселей в длину, то это допускается. (пример ниже)

Звезда - это всегда замкнутый контур, и он большинство его точек должны лежать в координатах круга, если нет - это помеха. Но допускаются также и маленькие искажения. Для понимания сравните фото и полученные изображения:

Все помеченные участки - звезды.
09a7a4bb4e5446099b630672cbf9ed62.png
Есть небольшие помехи, но они не играют важной роли. Можно зачислить к звездам.
8d3d7387ca5f4181bb3fd1f09b3dd990.png
Есть серьезные помехи. Хотя за логикой описанного, несколько областей все-таки попадут под определение звезды. Но это не столь важно.
143e4f4385d744c6b20cd82937f71390.png

Я думал сначала воспользоваться алгоритмом поиска контуров, накладывать маски на каждую точку изображения и смотреть, отвечает ли она ей. Так можно будет даже определить сколько звезд каких размеров есть ("малых - 24, больших - 14" и т.д). Но это очень запарно - делать стопицот масок к каждому размеру и сравнивать так.

Ести ли какой-нибудь способ сделать это красиво?

Замечание
Я не требую от программы 100% точности, и даже гарантирую, что буду кормить ее изображениями с минимальными помехами, а то, что показано выше - только пример.
  • Вопрос задан
  • 567 просмотров
Решения вопроса 1
lxsmkv
@lxsmkv
Test automation engineer
Вы переводите трехмерную информацию в двумерную, это ведет к потере информации. Отсюда проистекают дальнейшие "трудности". Понятно что количество звезд в кадре вы посчитать не сможете, а сможете лишь посчитать количество точек - проекций лучей звезд на двумерную плоскость. Понятно что, для того чтобы получить хоть какой-то результат нужно прибегать к методам статистической оценки.

Я бы построил график который для каждой смежной закрашеной области показывал бы ее величину, например количество точек входящих в смежную область. Для данного изображения получится сначала медленно поднимающаяся (много маленьких точек разного размера) и потом резко уходящая вверх кривая (большая область. Так можно будет выявить диапазон допустимых значений для размера звезды, на этом расстоянии. Т.е правую часть графика вы отсечете. Все остальное будут "наверное звезды".

Да и для засвеченой области можно применить какую нибудь экстраполяцию. Допустить что звезды по небу распределены равномерно. Для такой задачи где нельзя получить правильный ответ, любой метод приближенной оценки сгодится.

Говоря в общем:
Если человек не в состоянии решить аналитическую задачу, то компьютер не поможет. В данном случае человек не сможет толком сказать сколько звезд на этом двухцветном снимке. Он прибегнет как какой то эвристике. Вот эту эвристику и нужно заложить в алгоритм.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@kgbplus
Попробуйте какой нибудь алгоритм кластеризации объектов. Сколько кластеров получится - примерно столько звезд. Объектами должны быть пиксели с яркостью выше какого то порога.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы