Dans ce défi, vous allez créer un algorithme de compression de prévisualisation d'image. Son objectif est de réduire un fichier image arbitraire en une image d'aperçu de 4 Ko, qui peut être utilisée pour identifier rapidement des images avec très peu de bande passante.
Vous devez écrire deux programmes (ou un programme combiné): un compresseur et un décompresseur. Les deux doivent prendre un fichier ou stdin en entrée et sortir dans un fichier ou stdout. Le compresseur doit accepter une image dans un format d'image sans perte de choix (par exemple PNG, BMP, PPM) et produire un fichier d'au plus 4096 octets . Le décompresseur doit accepter tout fichier généré par le compresseur et produire une image aussi proche que possible de l'entrée. Notez qu'il n'y a pas de limite de taille de code source pour l'encodeur / décodeur, vous pouvez donc être créatif dans votre algorithme.
Restrictions:
Pas de tricherie'. Vos programmes ne peuvent pas utiliser d'entrées cachées, stocker des données sur Internet, etc. Il vous est également interdit d'inclure des fonctionnalités / données se rapportant uniquement à l'ensemble d'images de notation.
Pour les bibliothèques / outils / intégrés, vous êtes autorisé à utiliser des opérations de traitement d'image génériques (mise à l'échelle, flou, transformation de l'espace colorimétrique, etc.), mais pas les opérations de décodage / codage / compression d'image (sauf pour l'entrée du compresseur et la sortie du décompresseur). La compression / décompression générique est également interdite . Il est prévu que vous implémentiez votre propre compression pour ce défi.
Les dimensions de l'image produite par le décompresseur doivent correspondre exactement à celles du fichier d'origine remis au compresseur. Vous pouvez supposer que les dimensions de l'image ne dépassent pas 2 16 dans les deux sens.
Votre compresseur doit fonctionner sur un PC grand public en moins de 5 minutes, et le décompresseur doit fonctionner en moins de 10 secondes pour toute image de l'ensemble ci-dessous.
Notation
Pour faciliter la vérification rapide et la comparaison visuelle, veuillez inclure un album d'images sans perte du corpus de test après compression en utilisant votre réponse.
Votre compresseur sera testé à l'aide du corpus d'images suivant :
Vous pouvez télécharger toutes les images dans un fichier zip ici .
Votre score sera l' indice de similitude structurelle moyen de votre compresseur sur toutes les images. Nous utiliserons l'open source dssim
pour ce défi. Il est facilement construit à partir des sources, ou si vous êtes sur Ubuntu, il a également un PPA. Il est préférable de noter votre propre réponse, mais si vous ne savez pas comment créer des applications C et que vous n'exécutez pas Debian / Ubuntu, vous pouvez laisser quelqu'un d'autre marquer pour vous. dssim
attend l'entrée / sortie en PNG, donc convertissez d'abord votre sortie en PNG si vous sortez dans un format différent.
Pour rendre la notation indolore, voici un script Python d'aide rapide, utilisation 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)))
Le score le plus bas l'emporte.
You may assume that the image dimensions do not exceed 2^32 in either direction.
N'est-ce pas un peu excessif? Cela signifie que je dois utiliser jusqu'à 16 octets pour stocker une paire de coordonnées (x, y). Peu de fichiers d'image ont des dimensions supérieures à 2 ^ 16 (65536) pixels dans les deux sens, et 2 ^ 11 est suffisant pour toutes les images du corpus.
2^16
.