Ваша задача состоит в том, чтобы написать программу, которая берет входное изображение и запускает его через обнаружение краев, чтобы стать выходным изображением.
Обнаружение кромок работает следующим образом (если неясно, см. Раздел Обнаружение кромок ):
- Значение для пикселя - это общая яркость пикселя, поэтому, если он цветной, вам нужно сначала преобразовать его в оттенки серого (для простоты и возможности игры в гольф вы можете взять среднее значение для R, G и Б).
- Формулы для G x и G y для пикселя p (i, j) :
- G x = -1 * p (i-1, j-1) - 2 * p (i-1, j) - 1 * p (i-1, j + 1) + 1 * p (i + 1, j -1) + 2 * p (i + 1, j) + 1 * p (i + 1, j + 1)
- G y = -1 * p (i-1, j-1) - 2 * p (i, j-1) - 1 * p (i + 1, j-1) + 1 * p (i-1, j +1) + 2 * p (i, j + 1) + 1 * p (i + 1, j + 1)
- Значение для размера ребра в этом пикселе равно: √ (G x 2 + G y 2 )
Выходное изображение для каждого пикселя имеет размер края √ (G x 2 + G y 2 ) в градациях серого.
Бонусы:
- Выполните размытие по Гауссу, чтобы сгладить изображение, прежде чем сработает обнаружение краев, чтобы пропустить любые меньшие края. Это дает бонус -30% к конечному результату.
- Примите во внимание угол края. Вы даете выходному пикселю некоторый цвет, беря то же значение градаций серого и добавляя цвет из цветового круга, используя угол, полученный из формулы arctan (G y / G x ). Это дает еще один бонус -30% на конечный результат.
Правила:
- Вы можете опустить значение для крайних пикселей и установить для них черный цвет, или вы можете использовать 0 для любого пикселя за пределами изображения.
- Ваше выходное изображение должно быть в формате изображения, который можно открыть на большинстве компьютеров.
- Вывод должен быть записан на диск или передан в файл.
- Входные данные задаются в качестве аргумента командной строки, в форме относительного пути к изображению или передаются из командной строки.
- Это код гольф, поэтому выигрывает самый короткий код в байтах!
Ответы:
J
166 164 161 154 150 144143 байта.Не слишком много в гольфе; Я в основном свернул свою более длинную реализацию (см. Ниже), так что, вероятно, есть много возможностей для улучшения. Использует библиотеку BMP. Сохраняет результат в файл
o
. Я обрабатывал края пикселей, используя только полные ячейки 3х3, поэтому конечное изображение имеет ширину и высоту, меньшие на 2 пикселя.Использование:
Expanded:
Пример ввода и вывода:
источник
;._3
оператора subarray. Я заметил, что вы определили глаголp
с рангом 2 для работы с подмассивами после их создания. Вместо этого вы можете работать с каждым подрешеткой при резке. Моя попытка реализовать это на основе вашей работы256#.3#"0<.255<.3 3((|:S)&*+&.*:&(+/)&,S&*);._3%&3(3#256)+/@#:
. Это должно уменьшить его до 126 байтов.'o'writebmp~256#.3#"0<.255<.3 3(*+&.*:&(+/)&,(*|:))&((-,.0,.])1 2 1);._3%&3(3#256)+/@#:readbmp]stdin''
предполагая, что на стандартный ввод вводится только имя файла. Вы можете выполнить это, используяecho -n
так, чтобы дополнительный символ новой строки не включался в стандартный ввод. На моем компьютере сценарий автоматически закрывается при использовании входных данных для сценария, что означает, что мне не нужно включатьexit''
и может сохранить дополнительные 6 байтов, но я не уверен, верно ли это для всех.Python, 161 * 0,7 = 112,7 байта
С бонусом Gaussian Blur.
Поскольку вы явно не запрещали встроенные методы, вот OpenCV:
Без бонуса, 136 байт
источник
MATLAB, 212 * 0,4 = 84,8 байта
Использование панели инструментов фильтра и цветового пространства HSV
или без золота
источник
Love2D Lua, 466 байт
Принимает командную строку, выводит в файл с именем «o» в вашей папке приложений Love2D. Love2D не позволит вам сохранять файлы в другом месте.
Примерно настолько, насколько я мог бы сыграть в гольф, возможно, мог бы быть и дальше.
Разъяснения
Тестовое задание
И...
Хотя это на самом деле не улучшает мой результат (делает его хуже), вот версия с реализованным цветовым кругом.
900 - 270 = 630 байт
источник