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
.Réponses:
Python avec PIL, score 0,094218
Compresseur:
Décompresseur:
Les deux scripts prennent l'entrée via des arguments de ligne de commande, comme deux répertoires (entrée et sortie), et convertissent toutes les images dans le répertoire d'entrée.
L'idée est de trouver une taille qui correspond à moins de 4 Ko et a le même rapport d'aspect que l'original, et d'utiliser un filtre Lanczos pour obtenir une qualité aussi élevée que possible de l'image sous-échantillonnée.
Album Imgur d'images compressées, après redimensionnement aux dimensions d'origine
Sortie du script de notation:
la source
Java (vanille, devrait fonctionner avec java 1.5+), note 0,672
Il ne génère pas de bons scores dssim mais, à mon avis, il produit des images plus conviviales pour l'homme ...
Album: http://imgur.com/a/yL31U
Sortie du script de notation:
La chaîne de compression:
Pour décompresser, gonfler puis lire les index des blocs et sortir le patch correspondant dans le fichier de sortie, puis redimensionner aux dimensions d'origine.
Malheureusement, le code est trop volumineux pour stackoverflow et peut donc être trouvé à https://gist.github.com/anonymous/989ab8a1bb6ec14f6ea9
Courir:
La première fois que cette application est exécutée, les fichiers requis seront générés et enregistrés dans un répertoire relatif au répertoire de travail d'exécution. Cela peut prendre quelques minutes. Pour les exécutions ultérieures, cette étape n'aura pas besoin d'être effectuée.
la source