У меня есть фото ночного неба:
Программа оставляет на фото только те области, которые соответствуют определенному порогу, и так мы сможем определить все звезды на фото.
Пусть следующее изображение является примером работы этой программы и оно удовлетворяет всем нашим требованиям (на самом деле нет, но не в этом суть):
Теперь нам надо определить, сколько же звезд есть на этом фото и их размер, при этом игнорируя различные помехи.
Изображение закодировано в один долгий однострочный массив, где белые области отвечают "1", а черные - "0" (с ним мы и должны работать), но есть также функция, которая возвращает значение цвета определенного пикселя из него (пусть это будет выглядеть так: pick(x,y) == 0 или 1).
Размер звезды - диаметр наложенного не нее круга. Т.е. для звезды с одной точкою размер равен 1, если это квадрат 2на2 - то 2, если это крест 3на3 - то 3 и так далее.
На фото есть звезды, которые на изображении показаны прямой линией. Да, это не координаты круга, но если линия меньше 3 пикселей в длину, то это допускается. (пример ниже)
Звезда - это всегда замкнутый контур, и он большинство его точек должны лежать в координатах круга, если нет - это помеха. Но допускаются также и маленькие искажения. Для понимания сравните фото и полученные изображения:
Все помеченные участки - звезды.
Есть небольшие помехи, но они не играют важной роли. Можно зачислить к звездам.
Есть серьезные помехи. Хотя за логикой описанного, несколько областей все-таки попадут под определение звезды. Но это не столь важно.
Я думал сначала воспользоваться алгоритмом поиска контуров, накладывать маски на каждую точку изображения и смотреть, отвечает ли она ей. Так можно будет даже определить сколько звезд каких размеров есть ("малых - 24, больших - 14" и т.д). Но это очень запарно - делать стопицот масок к каждому размеру и сравнивать так.
Ести ли какой-нибудь способ сделать это красиво?ЗамечаниеЯ не требую от программы 100% точности, и даже гарантирую, что буду кормить ее изображениями с минимальными помехами, а то, что показано выше - только пример.