Джо змея голодна.
Он ест картинки, по одному пикселю за раз.
Он действительно любит яркие пиксели.
Соревнование
Запрограммируйте Джо, чтобы он съел самые яркие пиксели, которые он может найти, учитывая, что он может двигаться только вверх, вниз, влево или вправо.
Характеристики
- Джо должен начать с верхнего левого пикселя изображения.
- Джо может двигаться только горизонтально или вертикально на 1 каждый ход
- У Джо достаточно времени, чтобы переместить 1/3 количества пикселей на картинке (на 1/3 столько же, сколько пикселей). Если количество пикселей не кратно 3, округлите до ближайшего целого числа.
- Джо может пересечь свой путь, хотя это считается как 0 яркости
- Яркость основана на сумме r, g и b, поэтому яркость rgb (0,0,0) равна 0, а максимальная яркость - rgb (255,255,255).
вход
Вы можете ввести изображение, как вам нравится.
Выход
- изображение, показывающее конечный результат вашей картинки (с черными пикселями).
- Количество съеденной яркости (укажите, какой диапазон в вашем ответе)
счет
Ваша программа будет оценена на:
- Средняя яркость пикселей, которые съедает Джо / Средняя яркость пикселей на картинке *
* Вы можете жестко закодировать это в своей программе
Ваш общий балл будет средним из баллов для следующих изображений:
Тестовые изображения:
http://upload.wikimedia.org/wikipedia/en/thumb/f/f4/The_Scream.jpg/800px-The_Scream.jpg
code-challenge
image-processing
Стрейч маньяк
источник
источник
[![image description](SE URL for downsized image)](URL for original image)
.Ответы:
C ++, оценка:
1,420421,46766По сути, это немного более сложная версия двух существующих решений: из четырех возможных ходов он выбирает тот, который максимизирует яркость. Однако вместо того, чтобы смотреть только на яркость целевого пикселя, он смотрит на взвешенную сумму яркости пикселей в окрестности целевого пикселя, где пиксели, расположенные ближе к цели, имеют больший вес.
РЕДАКТИРОВАТЬ: Использование нелинейной яркости в расчете окрестности немного улучшает оценку.
Компилировать с
g++ joe.cpp -ojoe -std=c++11 -O3 -lcairo
. Требуется Каир.Беги с
joe <image-file> [<radius>]
.<image-file>
является входным PNG-изображением.<radius>
(необязательный аргумент) - радиус суммированной окрестности в пикселях (чем меньше, тем быстрее, чем больше (примерно), тем лучше). Выводится оценка и имя с именемout.<image-file>
.Полученные результаты
Больше глазных конфет
источник
if (o_neighborhood > o_max_neighborhood) o_max = *o, o_max_neighborhood = o_neighborhood;
только этот код устанавливает его. однако из-за использования nan сравнение всегда ложно, поэтому o_max никогда не устанавливается и используется неинициализированным.Python 3, оценка = 1,57
Сначала наша змея перемещается по изображению, создавая вертикальные линии на равном расстоянии друг от друга.
Мы можем расширить эту змею, взяв две точки рядом друг с другом на вертикальной линии и создав петлю, конечными точками которой являются они.
Мы организуем точки в пары, и для каждой пары мы сохраняем размер и среднее значение яркости петли, которая дает наибольшую среднюю яркость.
На каждом шаге мы выбираем пару с наибольшим значением, расширяем ее цикл, чтобы достичь максимальной средней яркости на расширении, и вычисляем новый оптимальный размер цикла и значение яркости для пары.
Мы храним триплеты (value, size, point_pair) в структуре кучи, отсортированной по значению, чтобы мы могли удалить самый большой элемент (в O (1)) и эффективно добавить новый модифицированный (в O (log n)).
Мы останавливаемся, когда достигаем предела количества пикселей, и эта змея будет последней змеей.
Расстояние между вертикальными линиями мало влияет на результаты, поэтому был выбран постоянный пиксель в 40 пикселей.
Полученные результаты
Примечание: оригинальная картинка «Крик» была недоступна, поэтому я использовал другую картинку «Крик» с аналогичным разрешением.
Gif, показывающий процесс расширения змеи на изображении «вихря»:
Код берет одно (или более разделенное пробелами) имя файла (ов) из стандартного ввода и записывает полученные изображения змей в файлы png и печатает результаты в стандартный вывод.
источник
Python 2 (оценка: 0,0797116)
Просто очень простой и наивный жадный алгоритм, чтобы заставить мяч двигаться.
Выход:
источник
sum of brightnesses of eaten pixels / amount of eaten pixels
правильная формула, правильно? Может быть, это просто действительно ужасный алгоритм;)The average brightness of pixels Joe eats / The average brightness of the pixels in the picture*
Ява (оценка: 0,6949)
Простой алгоритм, который съедает самый яркий пиксель из четырех пикселей, окружающих текущий пиксель. В случае ничьей съедаемый пиксель является случайным, что приводит к различным оценкам и получению изображений при каждом выполнении. Таким образом, приведенные ниже оценки представляют собой средние значения более 50 исполнений на каждом изображении.
Чтобы запустить его, либо отредактируйте три аргумента (существующих как константы класса) в источнике, либо передайте их через командную строку в форме, в
java HungryImageSnake <source> <iterations> <printScores>
которой<source>
находится исходный файл изображения, которое нужно съесть,<iterations>
и сколько раз оно съело изображение (принимая средний балл и сохранение лучшего балла за все итерации), и<printScores>
это правда, чтобы напечатать балл каждой итерации или ложь, чтобы нет.Средние оценки, по изображению, более пятидесяти итераций:
Лучшие результаты по изображениям за те же пятьдесят итераций:
Изображения с наибольшим количеством баллов:
Как видно из изображений, фактически съедено гораздо меньше трети пикселей, поскольку змея иногда застревает среди уже съеденных пикселей, на которых она остается в мертвой зоне до тех пор, пока случайность ее движений не приведет ее к съедобная часть изображения.
Кроме того, в результате повторного поедания пикселями змей оценки смещаются вниз, поскольку нулевая яркость битых пикселей снова учитывается в среднем. Я ожидал бы увидеть гораздо более высокие оценки, если бы алгоритм оценки был изменен, чтобы делить его только на количество ходов, которые привели к поеданию новых пикселей, а не всех ходов (включая те, где змея съедает уже мертвый пиксель, который она съела раньше ).
Конечно, лучшим подходом было бы создать эвристику яркости для каждого пикселя и найти путь
width * height / 3
пикселей с самой высокой средней яркостью, но я сомневаюсь, что этот подход будет оптимальным во время выполнения, особенно на больших изображениях, как число возможных перестановок будет очень большим. Позже я могу попытаться рассмотреть эту форму и опубликовать ее в отдельном ответе, если это так.источник
Python 2, оценка: 1.205
Некоторое время назад я собрал быстрое решение Python, но забыл опубликовать его. Вот. Он находит самые богатые блоки на изображении, затем перемещается к каждому блоку, съедая все лучшие блоки, которые он получает.
Полученные результаты
Пример изображения
Код Python 2.7
источник