Используя Algodoo и Paint, я сделал эти шесть 300 × 300 монохроматических изображений четырех удобных форм:
Этот класс изображений имеет следующие свойства:
- Они всегда имеют размер 300 × 300 пикселей, монохроматический (только черно-белый) и имеют ровно четыре белых области, которые соответствуют квадрату, кругу, треугольнику и шестерне.
- Формы никогда не пересекаются и не касаются друг друга, а также не касаются границы изображения и не выходят за границы.
- Формы всегда имеют одинаковый размер, но их можно вращать и располагать любым способом.
(Фигуры также имеют равные области, хотя при растеризации таким образом их число пикселей вряд ли будет точно эквивалентным.)
Вызов
Напишите самую короткую возможную программу или функцию, которая берет в имени файла такого изображения и поворачивает все белые пиксели ...
- красный,
(255, 0, 0)
если они на площади. - синий,
(0, 0, 255)
если они в кругу. - зеленый,
(0, 255, 0)
если они в треугольнике. - желтый,
(255, 255, 0)
если они в передаче.
например
подробности
Ваша программа должна работать эффективно для всех возможных входных изображений. (Будут введены только действительные 300 × 300 монохроматические изображения.) Шесть изображений, которые я предоставил, являются лишь примерами, вы не можете жестко запрограммировать их вывод в вашу программу.
Вы не можете использовать библиотеки или функции компьютерного зрения, встроенные или внешние. Суть в том, чтобы сделать это, используя ваши собственные операции на уровне пикселей. Вы можете использовать библиотеки изображений, которые просто позволяют открывать и изменять изображения (например, PIL для Python).
Вы можете использовать любые распространенные форматы файлов изображений без потерь для ввода и вывода, если вы придерживаетесь цветовой схемы.
Вы можете взять имя файла изображения в качестве аргумента функции, из стандартного ввода или из командной строки. Выходное изображение может быть сохранено в новый файл, тот же файл или просто отображено.
счет
Представление с наименьшим количеством байтов выигрывает. Я могу протестировать материалы с дополнительными изображениями, чтобы определить их достоверность.
источник
Ответы:
J -
246 224185 байтовЭто было весело!
Я повторно использовал часть связанных компонентов, которую использовал для задачи «Я в самой большой комнате» , и использовал соотношение между средним и максимальным расстоянием всех точек до центра каждого компонента. Я согласился с этим, так как он инвариантен как по масштабу, так и по вращению, и, по-видимому, достаточно хорош, чтобы различать фигуры как дано. Ранжирование этого значения от низкого до высокого дает мне порядок круга, снаряжение, квадрат и треугольник, используемые для перестановки цветовой карты.
Отображает результат, используя аддон viewmap. Не используются наборы инструментов, кроме чтения и вывода файлов.
Надежность, кажется, не является обязательным требованием, это занимает 18 байт. Еще 2 ненужных пробела, замененных
&.>
на&>
inratio
и&.:
на&:
dcent еще на 2 байта.Огромный выигрыш как в краткости, так и в производительности
comp
использования переключения вместоcut
(;.
). Таким образом, изображение копируется и сдвигается во всех 8 направлениях, а не сканируется с окном 3х3.id
Функция была до смешного сложной для того, что это нужно делать. Теперь он присваивает идентификаторы пикселям в объектах, умножая изображение на массив уникальных чисел, следовательно, устанавливая BG на ноль.Код немного более объяснен:
Это немного долго, чтобы объяснить подробно, но подойдет, если есть интерес.
источник
Mathematica,
459392 байтаUngolfed:
Я мог бы сэкономить еще 6 байтов, превращаясь
m=1.Mean@a;m=#-m&/@a;
вm=#-Mean@a&/@a;
, но это значительно увеличивает время выполнения, что раздражает для тестирования. (Обратите внимание, что это две оптимизации: извлечение вычисленийMean@a
вне цикла и использование точных символьных типов вместо чисел с плавающей запятой. Интересно, что использование точных типов намного важнее, чем вычисление среднего значения в каждой итерации.)Так что это подход номер три:
Теперь для всех пикселей в форме построим расстояние от угла до этого центра:
Треугольник имеет 3 четких максимума, квадрат 4, шестерню 16, а круг имеет тонны из-за наложения колебаний вокруг постоянного радиуса.
150
является максимумом.Для справки: если я использую идею Элл и просто сортирую регионы по наибольшему расстоянию между любым пикселем и центром, я могу сделать это в 342 байта:
Но я не намерен конкурировать с этим, пока все остальные используют свои собственные оригинальные алгоритмы вместо того, чтобы играть в чужие алгоритмы.
источник
Ява,
1204113210871076Просто чтобы доказать себе, что я могу это сделать.
Я включил импорт прямо рядом с объявлениями функций; это должно быть вне класса, чтобы это работало:
Неуправляемый (и пригодный для эксплуатации; т.е. добавленный шаблон):
Это работает, перебирая каждый пиксель изображения и заполняя каждый раз, когда мы достигаем «дыры». Мы добавляем каждый результат заливки как a
Set<Point>
кSet
. Затем мы определяем, какая форма какая. Это делается путем просмотра количества граничных пикселей фигуры. Я определил границу как движение рыцаря от черной плитки, так как это будет более постоянным между поворотами и тому подобным. Когда мы делаем это, становится ясно, что формы могут быть отсортированы по этому значению: круг, квадрат, треугольник, шестеренка. Поэтому я сортирую и устанавливаю все пиксели этой формы на правильный цвет.Обратите внимание, что изображение, к которому я пишу, напрямую не берется из файла, потому что, если бы я это сделал, Java воспринял бы изображение как черно-белое, и заполнение цветами не сработало бы. Поэтому я должен создать свой собственный образ с
TYPE_INT_RGB
(который есть1
). Также обратите внимание , что изображение , которое я делаю работу на это302
путем302
; это связано с тем, что алгоритму расстояния Найта не нужно беспокоиться о попытке считывания за пределами изображения. Я исправляю это несоответствие в размерах по телефонуi.getSubImage(1,1,300,300)
. Примечание. Возможно, я забыл исправить это при загрузке изображений, в этом случае изображения имеют ширину 2 пикселя, но за исключением этого факта, они должны быть правильнымиФункция перезапишет файл, путь которого передается. Выходы:
источник
Python,
571 567528 байтАналогично решению Quincunx, он начинается с заливки каждой фигуры индексом от 1 до 4. Затем он определяет идентичность фигур по радиусу их ограничивающей окружности. Цветовая палитра строится соответственно, и изображение сохраняется как изображение с индексированным цветом.
РЕДАКТИРОВАТЬ: пропустил тот факт, что формы гарантированно не касаются границы изображения. Короче, тогда!
Принимает имя файла ввода в командной строке и записывает вывод в
o.png
.источник
Mathematica 225
Обновление :
ОП решил, что этот подход использует функции компьютерного зрения, поэтому он больше не работает. Я оставлю это отправленным однако. Возможно, кто-то может найти это интересным.
ImageData
возвращает изображение в виде матрицы из 0 и 1.Flatten
преобразует эту матрицу в список.Morphological Components
находит 4 кластера пикселей и назначает отдельное целое число 1, 2, 3, 4 каждому пикселю в соответствии с кластером. 0 зарезервировано для (черного) фона.ComponentMeasurements
проверяет округлость кластеров.От большинства к наименее круглым всегда будет: круг, квадрат, треугольник и шестеренка.
ReplacePart
заменяет каждое целое число компонента соответствующим цветом RGB, используя сортировку по кругу.Partition...Dimensions[m][[2]]
берет список цветов пикселей и возвращает матрицу тех же размеров, что и входное изображение.Image
преобразует матрицу цветов пикселей в цветное изображение.источник
f@i_:=Image[#/.Append[Thread[Ordering[Last/@ComponentMeasurements[#,"Circularity"]]->{Yellow,Green,Red,Blue}],0->Black]]&@MorphologicalComponents@i
{RGBColor[1, 0, 0], RGBColor[0, 1, 0], RGBColor[0, 0, 1], RGBColor[1, 1, 0]}
где 1 соответствует 255. Библиотеки не использовались.MorphologicalComponents
удовлетворяет или нарушает ваши правила. Как только кто-то знает, к какому кластеру принадлежит каждый пиксель, существует множество способов, включая общее количество пикселей, чтобы определить, какая фигура является какой.(255,0,22)
когда я проверяю в Paint). У меня нет Mathematica, поэтому я не могу бежать, чтобы убедиться.Mathematica,
354345314291288Все еще игра в гольф, может быть сокращена еще на несколько символов, но производительность становится невыносимой. Использует дисперсию для определения форм:
С интервалом:
Тестирование:
Здесь это совершенно безвкусно. Позже добавлю объяснения:
источник
Python,
579577554514502501 байтДля каждой фигуры заполните ее, затем вычислите расстояние между центроидом и самой дальней точкой.
затем реальная поверхность формы сравнивается с поверхностью треугольника, квадрата, диска или колеса, которые имели бы одинаковый размер.
источник
C # 1086 байт
Еще одно решение для заполнения, просто для записи, поскольку здесь нет версии на C #. Как и Quincunx, я хотел доказать себе, что могу это сделать, и его подход в Java не сильно отличается.
Он принимает каждый формат изображения.
Вероятно, можно удалить несколько символов, удалив все статические элементы и создав экземпляр Program.
Читаемая версия:
Golfed:
источник