Размер луны тайна
Я уверен, что вы слышали, что луна меняет свой размер. Когда вы влюблены и вам повезло, луна почти в два раза больше по сравнению с обычными ситуациями. Некоторые люди говорят, что причина в атмосфере, которая действует как линза. Другие считают, что это только вопрос сравнения с другими объектами, такими как деревья поблизости. Какое бы объяснение вы ни прочитали, оно весьма субъективно.
Размер луны науки
Хорошо, мы программисты, не так ли? Мы опираемся на факты, верно? Итак, вот эксперимент:
- Возьмите красивую камеру, которая поддерживает настройку времени и диафрагмы вручную.
- Установите на вашей камере максимальный уровень масштабирования.
- Выйдите на улицу, сделайте несколько фотографий луны, чтобы определить лучшие настройки, чтобы луна была четкой, а освещение - просто отличным.
- Запомнить настройки
- Делайте фотографии Луны с этими настройками каждый раз, когда вы думаете, что она большая или маленькая.
- Рассчитать размер луны в пикселях
Камера не будет врать, не так ли? Подсчитывая яркие пиксели, мы можем эффективно измерить размер луны - по крайней мере, в пикселях.
Если размер одинаков для всех фотографий, это ошибка в нашем мозгу. Если размер отличается, то есть место для спекуляций
- Луна действительно растет (но что она ест?)
- есть атмосферный эффект линзы
- Луна имеет эллиптическую кривую и иногда ближе, иногда дальше от Земли
- ...
Но я оставлю это открытым, пока ваша задача не будет выполнена. Конечно, вы хотите знать заранее, может ли ваша программа точно рассчитать размер Луны.
Задание
Учитывая несколько оптимизированных изображений луны, пожалуйста, рассчитайте размер луны. Оптимизация: пиксели либо черные, либо белые. Ничего промежуточного. Нет сглаживания. Это облегчает, не так ли?
Предостережение: луна не всегда полная, вы знаете ... это может быть серп! Но даже в форме серпа размер луны больше. Таким образом, вы рассчитаете полный размер, пожалуйста.
- Ваша программа принимает PNG в качестве входных данных, например, в качестве аргумента командной строки имени файла, переданного по конвейеру
stdin
или в виде объекта Bitmap (из стандартной библиотеки фреймворка), если вы пишете функцию вместо программы. - Ваша программа работает с любым разумным размером входного растрового изображения, не обязательно квадратным. Минимальная ширина и высота 150 пикселей гарантированы.
- Полная луна покрывает не менее 25% снимка.
- Ваша программа выводит рассчитанный размер луны в пикселях, как если бы это была полная луна.
- Мы предполагаем, что луна - идеальная сфера.
- Точный размер всегда является целым числом, но вы можете вывести десятичное число, если ваши вычисления возвращают это.
- Точность должна быть между 98% и 102%. (Это скорее предположение, чем то, что я могу гарантировать, чтобы быть достижимым. Если вы думаете, что это слишком сложно, пожалуйста, оставьте комментарий.)
Обновление :
- Центр луны не обязательно находится в середине картины.
- Минимальная видимая область составляет 5% от Луны или 1,25% от общего количества пикселей.
- Снимок сделан таким образом, чтобы вся луна соответствовала изображению, то есть общее количество пикселей является верхней границей размера луны.
- Луна не будет обрезана / обрезана.
Образцы
Вы можете создавать свои собственные образцы, используя файл blend, если хотите. Я создал следующие картинки для вас. Вы можете сосчитать пиксели в PNG-файле, используя WhitePixelCounter.exe (требуется .NET), чтобы проверить, содержит ли изображение только черные и белые пиксели и сколько их.
Следующие изображения размером 256x256 пикселей отличаются по количеству белых пикселей, но все они должны привести к расчетному размеру луны 16416 пикселей.
И эти 177x177 пикселей изображения должны возвращать 10241 пикселей. Изображения в основном одинаковые, но на этот раз использовалась камера с другим фокусным расстоянием.
Неквадратные и нецентрированные образцы с результатом 9988:
О, у меня пока нет эталонной реализации, и я даже не знаю, могу ли я что-то реализовать. Но в моем мозгу есть сильное убеждение, которое говорит мне, что это должно быть математически разрешимо.
Правила
Это Код Гольф. Самый короткий код на 2015-03-30 принимается.
источник
Ответы:
Mathematica
126 119109 байтовMathematica может измерять удлинение компонента в изображении. Полнолуние, будучи абсолютно симметричным, имеет удлинение 0 по шкале от 0 до 1.
Уменьшающаяся луна становится все более вытянутой, максимально до 0,8.
0.998 -0.788 x-0.578 x^2
была эмпирически определенная модель (на основе больших фотографий) для «предсказания полноты луны (по площади) с учетом ее удлинения.Я настроил модель
1- 0.788 x -0.578 x^2
так, чтобы при нулевом удлинении (полная луна) модель вернула 1 для масштабного коэффициента пикселей. Он сохраняет 4 байта и остается в пределах точности.Эта модель используется для изображений любого размера. Изображение луны не нужно центрировать. Также не нужно покрывать фиксированную пропорцию фотографии.
Вот точки данных (удлинение, displayMoonPixels / fullMoonPixels) для больших изображений и параболическая модель, которая была создана для соответствия данным. Линейные модели подходят нормально, но квадратичная модель не работает в определенных пределах (см. Ниже).
Здесь данные из больших картинок. Так и модель
Ниже данные (красные точки) взяты из маленьких картинок. Модель (синяя кривая) - это модель, созданная большими изображениями, такая же, как показано выше.
Самый маленький полумесяц имеет 7,5% площади полной луны. (Самый маленький полумесяц среди больших фотографий составляет 19% от полной луны.) Если бы квадратичная модель была основана на маленьких фотографиях, подгонка ниже была бы лучше, только потому, что она вмещала маленький полумесяц. Надежная модель, которая будет выдерживать самые разные условия, в том числе очень маленькие полумесяцы, будет лучше сделана из более разнообразных изображений.
Близость соответствия показывает, что модель не была жестко запрограммирована для данных изображений. Мы можем быть совершенно уверены, что удлинение луны не зависит от размера фотографии, как можно было бы ожидать.
f
принимает изображение вi
качестве входных данных и выводит прогнозируемый размер полной луны в пикселях. Это работает для выстрелов вне центра.Как показывают данные ниже, это все тестовые случаи, кроме одного. Луны были расположены от полного до наиболее уменьшенного.
На фотографии может появиться несколько компонентов изображения. Даже один пиксель, отделенный от других, будет считаться отдельным компонентом. По этой причине необходимо искать «все» компоненты, чтобы найти тот, который имеет большее количество пикселей. (Одна из маленьких фотографий содержит более одного компонента изображения.)
Большие картинки
Предсказания размера луны, сделанные на больших фотографиях, были одинаково точными.
Маленькие картинки
Предсказания о размере луны, сделанные на маленьких фотографиях, были однородными, за одним большим исключением, окончательной картиной. Я подозреваю, что проблема связана с тем, что полумесяц очень узкий.
источник
i_~c~t_:=Max[#2&@@@i~ComponentMeasurements~t];f@i_:=i~c~"Count"/(1-0.788x-0.578x^2/.x->i~c~"Elongation")
#2&@@@
предложение не работаетc
этоc=Max@ComponentMeasurements[##][[All,2]]&
J
227207 байт (максимальная ошибка 1,9%)Моя основная идея состоит в том, что если мы можем найти 3 точки на контуре луны, которые также находятся на контуре полной луны, мы можем вычислить окружность этих точек. Этот круг будет на полнолуние.
Если мы найдем две белые точки с максимальным расстоянием, они всегда будут такими точками, поскольку они будут либо реальной диагональю в полнолуние, либо конечными точками полумесяца.
Мы можем найти пару точек с наибольшим расстоянием на любом графике, выбрав точку, наиболее удаленную от любой заданной начальной точки, а затем выбрав точку, наиболее удаленную от выбранной.Найдем третью точку с максимальным значением произведений расстояний от предыдущих точек. Это всегда будет на контуре и на внешней стороне полумесяца или большей стороны гиббуса.
Диаметр окружности рассчитывается как длина одной стороны, деленная на синус противоположного угла.
Временная сложность этого метода линейна по размеру входного изображения.
Код
Функция ожидает входное имя файла в виде строки.
(Для (немного) более читаемой версии проверьте историю изменений.)
Объяснение кода
вторая часть определения s создает список из 3 пунктов:
s - длина стороны треугольника ABC
Результаты
Наибольшая ошибка составляет 1,9%.
Изображения в том же порядке, что и в вопросе.
источник
Matlab
162156 (не совсем в текущей погрешности)Прежде всего: точность составляет менее 2% для всех изображений, кроме одного, в каждой из двух серий, где она выше (около 5% и 14%). Мой подход заключался в том, чтобы найти два пикселя луны, которые находятся дальше всего друг от друга, а затем использовать это как оценку диаметра.
Это результаты точности (относительное отклонение
1 - (predicted size / real size)
)источник
C # - 617
Это решение не работает для всех изображений, потому что на одном из изображений наклон (m) становится бесконечным.
Принцип был упомянут ранее:
Проблемным случаем является тот, где уклон бесконечен. Это можно обойти, повернув изображение на 90 ° или в коде, зацикливая вокруг
y
оси вместоx
.Минимальная точность
источник