El objetivo de este desafío es determinar el ángulo de una línea en una imagen.
Reglas sobre la imagen:
- El fondo de la imagen será blanco (
#FFFFFF
) - El trazo de la línea será negro (
#000000
) - La línea NO será anti-alias
- La imagen tendrá 100x100 píxeles.
- La línea comenzará en el centro de la imagen.
- La línea comenzará a apuntar hacia abajo (6-OClock)
- La línea tendrá 50 píxeles de largo.
- El ángulo de la línea se medirá en sentido antihorario desde la posición inicial
- El códec de imagen será
.jpg
o.png
El formato de entrada será un nombre de archivo pasado por la línea de comando arg, entrada de script o función arg. El formato de salida es simple: simplemente envíe el número de grados (por ejemplo 90
).
Las respuestas pueden ser ± 1 grado de la medida indicada. Aquí hay algunas imágenes de ejemplo:
Una imagen de referencia a 45 grados con fondo gris.
0 grados
45 grados
50 grados
130 grados
230 grados
324 grados
Aquí está el código utilizado para crear las imágenes (esto está codificado con 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
J Atkin
fuente
fuente
Respuestas:
Pyth -
2826 bytesUtiliza el mismo tipo de estrategia de fuerza bruta que la respuesta js.
Toma la entrada como nombre de archivo desde stdin.
fuente
JavaScript (ES6), 225
227244bytesHagamos rodar la pelota:
Simplemente pase la URL de la imagen a la función:
Alerta grados dentro del rango ± 1. Pasó todos los casos de prueba.
Sin golf
Ediciones
fuente
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://
. Necesita establecer lacrossOrigin
propiedad. Además, no funcionará si la carga de la imagen tarda 0.00001 segundos más que la creación del lienzo. Además, no necesitaf=
, cortando 2 bytes. ¡Pero es una buena solución! Mi voto a favor por ello.onload
parte porque fui socavada en otro desafío debido a eso. Así que pensé que estaba bien suponer que se carga lo suficientemente rápido. En cuanto a la función anónima, no estoy seguro de cómo contarla. Si cortof=
y quiero invocarlo, tengo que envolverlo()
como(s=>{})('arg');
. ¿Puedo ignorar esto en el recuento de bytes?Matlab,
118104bytesGenero una matriz del mismo tamaño que la imagen con números complejos (0 en el centro) y extraigo de esa matriz los valores que están en la línea. Entonces se muestra el argumento de la media de esos.
¡Gracias a @ThomasKwa por sugerir una mejora en la precisión que también resultó en un código más corto!
fuente
Matlab,
8677 bytesAquí hay otra forma de usar Matlab:
Esto lee el archivo (robado de flawr ) y encuentra los índices de los píxeles negros. Luego, calcula el vector que apunta desde el centro de la imagen a cada píxel negro, y lo utiliza
atan2d
para encontrar el ángulo, redondear para obtener ángulos enteros y hacermod(...,360)
para obtener resultados en el rango correcto. Para obtener el ángulo correcto (hay un pequeño error para los píxeles cerca del centro), tome el ángulo calculado más comúnmente.Gracias a slvrbld por la
im2bw
sugerencia!fuente
Labview, 10098 bytes
Pongamos otro código labview por ahí.
Como no hay una forma oficial de contar bytes en labview, uso el tamaño del archivo cuando lo guardo. Alternativamente, contando cada cable y función como 1 y el caso como 2, saldría a 71.
Cargue la imagen, aplánelo a 1D, escanee 0s desde ambos lados y tome el primero, calcule de nuevo al punto y use la geometría para obtener el ángulo.
fuente
,
para decimales.