En este desafío, creará un algoritmo de compresión de vista previa de imagen. Su objetivo es reducir un archivo de imagen arbitrario a una imagen de vista previa de 4 KiB, que se puede utilizar para identificar rápidamente imágenes con muy poco ancho de banda.
Debe escribir dos programas (o un programa combinado): un compresor y un descompresor. Ambos deben tomar un archivo o stdin como entrada y salida a un archivo o stdout. El compresor debe aceptar una imagen en el formato de imagen principal sin pérdida de elección (por ejemplo, PNG, BMP, PPM), y generar un archivo de 4096 bytes como máximo . El descompresor debe aceptar cualquier archivo generado por el compresor y mostrar una imagen lo más cerca posible de la entrada. Tenga en cuenta que no hay límite de tamaño de código fuente para el codificador / decodificador, por lo que puede ser creativo en su algoritmo.
Restricciones
No hay "trampa". Sus programas no pueden usar entradas ocultas, almacenar datos en Internet, etc. También se le prohíbe incluir características / datos relacionados únicamente con el conjunto de imágenes de puntuación.
Para las bibliotecas / herramientas / muebles empotrados que está permitido el uso de genéricos operaciones de procesamiento de imágenes (escalamiento, visión borrosa, color de transformación del espacio, etc), pero no de decodificación de imágenes / codificación / compresión de las operaciones (excepto para la entrada del compresor y descompresor de salida). La compresión / descompresión genérica también está prohibida . Se pretende que implemente su propia compresión para este desafío.
Las dimensiones de la salida de imagen por el descompresor deben coincidir exactamente con las del archivo original dado al compresor. Puede suponer que las dimensiones de la imagen no superan los 2 16 en ninguna dirección.
Su compresor debe funcionar en una PC de consumo promedio en menos de 5 minutos, y el descompresor debe funcionar en menos de 10 segundos para cualquier imagen en el conjunto a continuación.
Tanteo
Para ayudar a la verificación rápida y la comparación visual, incluya un álbum de imágenes sin pérdida del corpus de prueba después de la compresión con su respuesta.
Su compresor será probado usando el siguiente corpus de imágenes :
Puede descargar todas las imágenes en un archivo zip aquí .
Su puntaje será el índice de similitud estructural promedio para su compresor en todas las imágenes. Utilizaremos el código abierto dssim
para este desafío. Se construye fácilmente desde la fuente, o si estás en Ubuntu también tiene un PPA. Es preferible que obtenga su propia respuesta, pero si no sabe cómo crear aplicaciones C y no ejecuta Debian / Ubuntu, puede dejar que alguien más lo haga por usted.dssim
espera entrada / salida en PNG, por lo tanto, convierta su salida a PNG primero si sale en un formato diferente.
Para que la puntuación sea indolora, aquí hay un script de Python de ayuda rápida, uso python score.py corpus_dir compressed_dir
:
import glob, sys, os, subprocess
scores = []
for img in sorted(os.listdir(sys.argv[1])):
ref, preview = (os.path.join(sys.argv[i], img) for i in (1, 2))
sys.stdout.write("Comparing {} to {}... ".format(ref, preview))
out = subprocess.check_output(["dssim", ref, preview]).decode("utf-8").split()[0]
print(out)
scores.append(float(out))
print("Average score: {:.6f}".format(sum(scores) / len(scores)))
La puntuación más baja gana.
You may assume that the image dimensions do not exceed 2^32 in either direction.
¿No es esto un poco excesivo? Esto significa que tengo que usar hasta 16 bytes para almacenar un par de coordenadas (x, y). Pocos archivos de imagen tienen dimensiones de más de 2 ^ 16 (65536) píxeles en cualquier dirección, y 2 ^ 11 es suficiente para todas las imágenes en el corpus.2^16
.Respuestas:
Python con PIL, puntaje 0.094218
Compresor:
Descompresor:
Ambas secuencias de comandos toman entrada a través de argumentos de línea de comando, como dos directorios (entrada y salida), y convierten todas las imágenes en el directorio de entrada.
La idea es encontrar un tamaño que se ajuste a menos de 4 KiB y tenga la misma relación de aspecto que el original, y usar un filtro Lanczos para obtener la mayor calidad posible de la imagen muestreada.
Imgur álbum de imágenes comprimidas, después de cambiar el tamaño a las dimensiones originales
Resultado del script de puntuación:
fuente
Java (vainilla, debería funcionar con java 1.5+), puntaje 0.672
No genera puntajes dssim particularmente buenos pero, a mi parecer, produce imágenes más amigables para los humanos ...
Álbum: http://imgur.com/a/yL31U
Resultado del script de puntuación:
La cadena de compresión:
Para descomprimir, inflar y luego leer los índices de bloque y enviar el parche correspondiente al archivo de salida, luego cambiar el tamaño a las dimensiones originales.
Lamentablemente, el código es demasiado grande para stackoverflow, por lo que puede encontrarlo en https://gist.github.com/anonymous/989ab8a1bb6ec14f6ea9
Correr:
La primera vez que se ejecuta esta aplicación, los archivos necesarios se generarán y guardarán en un directorio relativo al directorio de trabajo de ejecución. Esto puede tomar unos pocos minutos. Para ejecuciones posteriores, no será necesario realizar este paso.
fuente