In dieser Herausforderung erstellen Sie einen Bildvorschau-Komprimierungsalgorithmus. Ziel ist es, eine beliebige Bilddatei auf ein Vorschaubild von 4 KB zu reduzieren, mit dem Bilder mit sehr geringer Bandbreite schnell identifiziert werden können.
Sie müssen zwei Programme (oder ein kombiniertes Programm) schreiben: einen Kompressor und einen Dekompressor. Beide müssen eine Datei oder stdin als Eingabe nehmen und in eine Datei oder stdout ausgeben. Der Kompressor muss ein Bild in einem verlustfreien Mainstream-Bildformat (z. B. PNG, BMP, PPM) akzeptieren und eine Datei von höchstens 4096 Bytes ausgeben . Der Dekomprimierer muss alle vom Komprimierer generierten Dateien akzeptieren und ein Bild ausgeben, das der Eingabe möglichst nahe kommt. Beachten Sie, dass es für den Encoder / Decoder keine Größenbeschränkung für den Quellcode gibt, sodass Sie in Ihrem Algorithmus kreativ sein können.
Beschränkungen:
Kein Schummeln'. Ihre Programme verwenden möglicherweise keine versteckten Eingaben, speichern Daten im Internet usw. Es ist Ihnen auch untersagt, Funktionen / Daten einzubeziehen, die sich nur auf den Satz von Scoring-Bildern beziehen.
Für Bibliotheken / tools / Einbauten Sie sind zu verwenden , erlauben generische Bildverarbeitungsoperationen (Skalierung, Unschärfen, Farbraumtransformation, etc.), aber nicht Bilddekodierungs / Codierung / Kompressionsoperationen (außer Kompressoreingang und Dekompressor - Ausgabe). Generische Komprimierung / Dekomprimierung ist ebenfalls nicht zulässig . Es ist beabsichtigt, dass Sie Ihre eigene Komprimierung für diese Herausforderung implementieren.
Die Abmessungen des vom Dekomprimierer ausgegebenen Bildes müssen genau mit denen der Originaldatei übereinstimmen, die dem Komprimierer übergeben wurde. Sie können davon ausgehen, dass die Bildabmessungen in beiden Richtungen 2 16 nicht überschreiten .
Ihr Kompressor muss auf einem durchschnittlichen Consumer-PC in weniger als 5 Minuten ausgeführt werden, und der Dekomprimierer muss in weniger als 10 Sekunden ausgeführt werden, damit ein Bild im folgenden Satz angezeigt wird.
Wertung
Fügen Sie nach der Komprimierung anhand Ihrer Antwort ein verlustfreies Bildalbum des Testkorpus bei, um eine schnelle Überprüfung und einen visuellen Vergleich zu ermöglichen .
Ihr Kompressor wird mit den folgenden Bildern getestet :
Sie können alle Bilder in einer Zip-Datei hier herunterladen .
Ihr Ergebnis ist der durchschnittliche strukturelle Ähnlichkeitsindex für Ihren Kompressor auf allen Bildern. Wir werden Open Source dssim
für diese Herausforderung verwenden. Es lässt sich leicht aus dem Quellcode erstellen oder wenn Sie auf Ubuntu arbeiten, hat es auch eine PPA. Es wird bevorzugt, wenn Sie Ihre eigene Antwort erhalten, aber wenn Sie nicht wissen, wie C-Anwendungen erstellt werden, und wenn Sie Debian / Ubuntu nicht ausführen, können Sie sich von jemand anderem bewerten lassen. dssim
Erwartet Eingabe / Ausgabe in PNG, konvertieren Sie Ihre Ausgabe also zuerst in PNG, wenn Sie in einem anderen Format ausgeben.
Um das Scoring schmerzlos zu machen, folgt ein schnelles Hilfsskript für Python 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)))
Die niedrigste Punktzahl gewinnt.
You may assume that the image dimensions do not exceed 2^32 in either direction.
Ist das nicht ein bisschen übertrieben? Das heißt, ich muss bis zu 16 Bytes verwenden, um ein Paar (x, y) Koordinaten zu speichern. Nur wenige Bilddateien haben in beiden Richtungen Abmessungen von mehr als 2 ^ 16 (65536) Pixeln, und 2 ^ 11 ist für alle Bilder im Korpus ausreichend.2^16
.Antworten:
Python mit PIL, Punktzahl 0.094218
Kompressor:
Dekomprimierer:
Beide Skripte nehmen Eingaben über Befehlszeilenargumente als zwei Verzeichnisse (Eingabe und Ausgabe) entgegen und konvertieren alle Bilder im Eingabeverzeichnis.
Die Idee ist, eine Größe zu finden, die unter 4 KiB passt und dasselbe Seitenverhältnis wie das Original aufweist, und einen Lanczos-Filter zu verwenden, um eine möglichst hohe Qualität des heruntergerechneten Bildes zu erzielen.
Imgur Album von komprimierten Bildern, nach der Größenänderung auf die ursprünglichen Dimensionen
Scoring-Skriptausgabe:
quelle
Java (Vanille, sollte mit Java 1.5+ funktionieren), Score 0.672
Es erzeugt keine besonders guten Dssim-Scores, aber meiner Meinung nach erzeugt es menschlichere Bilder ...
Album: http://imgur.com/a/yL31U
Scoring-Skriptausgabe:
Die Kompressionskette:
Zum Dekomprimieren füllen Sie die Blockindizes auf, lesen Sie sie und geben Sie den entsprechenden Patch in die Ausgabedatei aus. Ändern Sie dann die Größe auf die ursprünglichen Abmessungen.
Leider ist der Code zu groß für Stackoverflow und kann unter https://gist.github.com/anonymous/989ab8a1bb6ec14f6ea9 gefunden werden
Zu rennen:
Bei der ersten Ausführung dieser Anwendung werden die erforderlichen Dateien generiert und in einem Verzeichnis gespeichert, das sich auf das Ausführungsarbeitsverzeichnis bezieht. Das kann ein paar minuten dauern. Für nachfolgende Ausführungen muss dieser Schritt nicht ausgeführt werden.
quelle