Цель этой задачи - определить угол линии на изображении.
Правила на изображении:
- Фон изображения будет белым (
#FFFFFF
) - Штрих линии будет черным (
#000000
) - Линия НЕ будет сглажена
- Изображение будет 100х100 пикселей
- Линия начнется в центре изображения
- Линия начнет указывать вниз (6 часов)
- Линия будет длиной 50 пикселей
- Угол линии будет измеряться против часовой стрелки от начальной позиции
- Кодек изображение будет либо
.jpg
или.png
Формат ввода - это имя файла, передаваемое из командной строки arg, ввод сценария или функция arg. Формат вывода прост - просто выведите количество градусов (например 90
).
Ответы могут быть ± 1 градус заявленной меры. Вот несколько примеров изображений:
Эталонное изображение под 45 градусов с серым фоном
0 градусов
45 градусов
50 градусов
130 градусов
230 градусов
324 градуса
Вот код, используемый для создания изображений (это кодируется с помощью Processing ):
int deg = 45;
int centX = width/2, centY = height/2;
background(255);
noSmooth();
line(centX,
centY,
centX + sin(radians(deg))*50,
centY + cos(radians(deg))*50);
saveFrame("line-"+deg+".png");// image codec can be changed here. use '.png' or '.jpg'
code-golf
image-processing
Дж Аткин
источник
источник
Ответы:
Pyth -
2826 байтИспользует ту же стратегию грубой силы, что и в ответе js.
Принимает ввод как имя файла от стандартного ввода.
источник
JavaScript (ES6), 225
227244байтаДавайте запустим мяч:
Просто передайте URL изображения функции:
Предупреждает градусов в пределах ± 1 диапазона. Пройдены все тестовые случаи.
Ungolfed
Правки
источник
s=>{(i=new Image).src=s;with(Math)with(document.createElement`canvas`.getContext`2d`)for(drawImage(i,0,0,100,100),a=360;r=--a/180*PI;)getImageData(50+48*cos(r),50+48*sin(r),1,1).data[1]||alert((450-a)%360)}
file://
. Вам необходимо установитьcrossOrigin
свойство. Кроме того, он не будет работать, если загрузка изображения занимает на 0,00001 секунды больше, чем при создании холста. Кроме того, вам не нужноf=
, обрезая 2 байта. Но это действительно хорошее решение !!! Мой голос за это.onload
часть, потому что меня подорвали в другом испытании. Поэтому я подумал, что можно предположить, что он загружается достаточно быстро. Что касается анонимной функции, я не уверен, как ее посчитать. Если я отключаюсьf=
и хочу вызвать это, я должен обернуть это()
как(s=>{})('arg');
. Могу ли я игнорировать это в подсчете байтов?Matlab,
118104 байтаЯ генерирую матрицу того же размера, что и изображение с комплексными числами (0 в центре), и извлекаю из этой матрицы значения, которые находятся в строке. Аргумент среднего из тех затем отображается.
Спасибо @ThomasKwa за предложение улучшить точность, что также привело к сокращению кода !!!
источник
Matlab,
8677 байтВот еще один способ использования Matlab:
Это читает файл (украденный из flawr ) и находит индексы черных пикселей. Затем он обрабатывает вектор, который указывает от центра изображения на каждый черный пиксель, и использует его
atan2d
для нахождения угла, округления для получения целочисленных углов и выполненияmod(...,360)
для получения результатов в нужном диапазоне. Чтобы получить правильный угол (есть небольшая ошибка для пикселей, расположенных близко к центру), выберите наиболее часто рассчитанный угол.Спасибо slvrbld за
im2bw
предложение!источник
Labview, 10098 байт
Давайте добавим еще один код labview.
Поскольку в labview нет официального способа подсчета байтов, я использую размер файла при сохранении. В качестве альтернативы, считая каждый провод и функцию как 1, а случай как 2, он получит 71.
Загрузите изображение, выровняйте в 1D, отсканируйте на 0 с обеих сторон и возьмите первое, рассчитайте обратно до точки и используйте геометрию, чтобы получить угол.
источник
,
десятичные знаки.