Su tarea es escribir un programa que tome una imagen de entrada y ejecutarla a través de detección de bordes para convertirse en una imagen de salida.
La detección de bordes funciona de la siguiente manera (si no está claro, ver detección de bordes sobel ):
- El valor de un píxel es el brillo total de un píxel, por lo que si está en color, primero deberá convertirlo a escala de grises (para mantener las cosas simples y aptas para el golf, puede tomar el valor promedio para R, G y SI).
- Las fórmulas para G x y G y para el píxel p (i, j) son:
- 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)
- El valor para el tamaño del borde en ese píxel es entonces: √ (G x 2 + G y 2 )
La imagen de salida es para cada píxel del tamaño del borde √ (G x 2 + G y 2 ) como escala de grises.
Bonificaciones:
- Realice un desenfoque gaussiano para suavizar la imagen antes de que se active la detección de bordes, para omitir los bordes más pequeños. Esto le da un bono de -30% en el resultado final.
- Tome el ángulo del borde en cuenta. Le da un poco de color al píxel de salida, tomando el mismo valor de escala de grises y agregando color de una rueda de colores usando el ángulo obtenido de la fórmula arctan (G y / G x ). Esto le da otra bonificación de -30% en el resultado final.
Reglas:
- Puede omitir el valor de los píxeles de borde y establecerlos en negro, o puede usar 0 para cualquier píxel fuera de la imagen.
- Su imagen de salida debe estar en un formato de imagen que se pueda abrir en la mayoría de las computadoras.
- La salida debe escribirse en el disco o ser canalizable a un archivo.
- La entrada se proporciona como un argumento de línea de comandos, en forma de una ruta relativa a la imagen, o se canaliza desde la línea de comandos.
- Este es el código de golf, por lo que gana el código más corto en bytes.
Respuestas:
J,
166 164 161 154 150 144143 bytes.No jugaba demasiado al golf; Principalmente colapsé mi implementación más larga (ver más abajo), por lo que probablemente haya mucho margen de mejora. Utiliza la biblioteca BMP. Guarda el resultado en el archivo
o
. Manejé los píxeles de borde solo usando celdas completas de 3x3, por lo que la imagen final tiene un ancho y una altura más pequeños en 2 píxeles.Uso:
Expandido:
Muestra de entrada y salida:
fuente
;._3
operador de submatriz. Noté que definiste un verbop
con rango 2 para operar en las submatrices después de crearlas. En su lugar, podría operar en cada subcadena cuando corte. Mi intento de implementarlo en función de su trabajo es256#.3#"0<.255<.3 3((|:S)&*+&.*:&(+/)&,S&*);._3%&3(3#256)+/@#:
. Eso debería reducirlo a 126 bytes en total.'o'writebmp~256#.3#"0<.255<.3 3(*+&.*:&(+/)&,(*|:))&((-,.0,.])1 2 1);._3%&3(3#256)+/@#:readbmp]stdin''
suposición de que solo el nombre de archivo se ingresa en stdin. Puede realizar esto usandoecho -n
para que no se incluya una nueva línea adicional en stdin. En mi computadora, el script se cierra automáticamente cuando uso una entrada canalizada a un script, lo que significa que no tengo que incluir elexit''
y puedo guardar 6 bytes adicionales, pero no estoy seguro de si esto es cierto para todos.Python, 161 * 0.7 = 112.7 bytes
Con el bono Gaussian Blur.
Como no prohibió explícitamente los métodos integrados, aquí está OpenCV:
Sin bono, 136 bytes
fuente
MATLAB, 212 * 0.4 = 84.8 bytes
Usando la caja de herramientas de filtro y el espacio de color HSV
o sin golf
fuente
Love2D Lua, 466 bytes
Toma la entrada de la línea de comandos, emite un archivo llamado "o" en la carpeta de datos de aplicaciones de Love2D. Love2D no te permitirá guardar archivos en ningún otro lugar.
Casi tan golfizado como pude conseguirlo, probablemente podría jugar más golf.
Explicado
Prueba
Y...
Aunque en realidad no mejora mi puntaje (lo empeora de hecho), aquí está la versión con la rueda de colores implementada.
900-270 = 630 bytes
fuente