In questa sfida creerai un algoritmo di compressione dell'anteprima dell'immagine. L'obiettivo è ridurre un file di immagine arbitrario a un'immagine di anteprima di 4 KiB, che può essere utilizzata per identificare rapidamente le immagini con una larghezza di banda molto ridotta.
È necessario scrivere due programmi (o un programma combinato): un compressore e un decompressore. Entrambi devono prendere un file o uno stdin come input e l'output in un file o stdout. Il compressore deve accettare un'immagine in un formato di immagine lossless tradizionale di scelta (ad esempio PNG, BMP, PPM) e produrre un file di massimo 4096 byte . Il decompressore deve accettare qualsiasi file generato dal compressore e produrre un'immagine il più vicino possibile all'input. Nota che non esiste un limite di dimensione del codice sorgente per l'encoder / decodificatore, quindi puoi essere creativo nel tuo algoritmo.
restrizioni:
Non imbrogliare'. I tuoi programmi non possono utilizzare input nascosti, memorizzazione di dati su Internet, ecc. È inoltre vietato includere funzionalità / dati relativi solo al set di immagini di punteggio.
Per librerie / strumenti / built-in che sono autorizzati a utilizzare generiche operazioni di elaborazione delle immagini (ridimensionamento, sfocatura, colore spazio di trasformazione, ecc), ma non immagine decodifica / codifica / compressione operazioni (eccetto per l'ingresso del compressore e decompressore uscita). Anche la compressione / decompressione generica non è consentita . Si intende implementare la propria compressione per questa sfida.
Le dimensioni dell'immagine emessa dal decompressore devono corrispondere esattamente a quelle del file originale fornito al compressore. Si può presumere che le dimensioni dell'immagine non superino 2 16 in entrambe le direzioni.
Il compressore deve funzionare su un PC consumer medio in meno di 5 minuti e il decompressore deve funzionare in meno di 10 secondi per qualsiasi immagine nel set di seguito.
punteggio
Per una rapida verifica e confronto visivo, includere un album di immagini senza perdita del corpus di prova dopo la compressione usando la risposta.
Il compressore verrà testato utilizzando il seguente corpus di immagini :
Puoi scaricare tutte le immagini in un file zip qui .
Il tuo punteggio sarà l' indice di somiglianza strutturale media per il tuo compressore su tutte le immagini. Useremo l'open source dssim
per questa sfida. È facilmente compilato dal sorgente, o se sei su Ubuntu ha anche un PPA. È preferibile assegnare un punteggio alla propria risposta, ma se non si sa come creare applicazioni C e non si esegue Debian / Ubuntu, è possibile lasciare che qualcun altro ottenga un punteggio per te. dssim
si aspetta input / output in PNG, quindi converti prima l'output in PNG se l'output è in un formato diverso.
Per rendere il punteggio indolore, ecco uno script Python di supporto rapido, utilizzo 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)))
Il punteggio più basso vince.
You may assume that the image dimensions do not exceed 2^32 in either direction.
Non è un po 'eccessivo? Questo significa che devo usare fino a 16 byte per memorizzare una coppia di coordinate (x, y). Pochi file di immagini hanno dimensioni superiori a 2 ^ 16 (65536) pixel in entrambe le direzioni e 2 ^ 11 è sufficiente per tutte le immagini nel corpus.
2^16
.