W tym wyzwaniu będziesz tworzyć algorytm kompresji podglądu obrazu. Jego celem jest zredukowanie dowolnego pliku obrazu do obrazu podglądu 4 KiB, którego można użyć do szybkiej identyfikacji obrazów o bardzo małej przepustowości.
Musisz napisać dwa programy (lub jeden program łączony): kompresor i dekompresor. Oba muszą przyjmować plik lub standardowe wejście jako dane wejściowe i wyjściowe do pliku lub standardowego wejścia. Kompresor musi zaakceptować jeden obraz w wybranym głównym formacie bezstratnym (np. PNG, BMP, PPM) i wygenerować plik o maksymalnej wielkości 4096 bajtów . Dekompresor musi zaakceptować dowolny plik wygenerowany przez kompresor i wysyłać obraz jak najbliżej wejścia. Pamiętaj, że koder / dekoder nie ma limitu rozmiaru kodu źródłowego, więc możesz być kreatywny w swoim algorytmie.
Ograniczenia:
Bez oszukiwania'. Twoje programy nie mogą używać ukrytych danych wejściowych, przechowywania danych w Internecie itp. Zabronione jest również włączanie funkcji / danych dotyczących tylko zestawu obrazów punktowanych.
Dla bibliotek / narzędzi / Wbudowana ins wy są wolno używać rodzajowe operacje przetwarzania obrazu (skalowanie, rozmycie, kolor transformacji przestrzeni, itp), ale nie obraz dekodowanie / kodowanie / kompresja operacje (oprócz wejścia kompresor i dekompresor wyjściu). Ogólna kompresja / dekompresja jest również niedozwolona . Planowane jest wdrożenie własnej kompresji dla tego wyzwania.
Wymiary obrazu wysyłanego przez dekompresor muszą dokładnie odpowiadać wymiarom oryginalnego pliku przekazanego kompresorowi. Możesz założyć, że wymiary obrazu nie przekraczają 2 16 w obu kierunkach.
Kompresor musi działać na przeciętnym komputerze osobistym w mniej niż 5 minut, a dekompresor musi działać w mniej niż 10 sekund dla dowolnego obrazu z poniższego zestawu.
Punktacja
Aby pomóc w szybkiej weryfikacji i porównaniu wizualnym, dołącz bezstratny album zdjęć korpusu testowego po kompresji, używając swojej odpowiedzi.
Twój kompresor zostanie przetestowany przy użyciu następującego zbioru obrazów :
Możesz pobrać wszystkie obrazy w pliku zip tutaj .
Twój wynik będzie średnim wskaźnikiem podobieństwa strukturalnego sprężarki na wszystkich obrazach. Do dssim
tego wyzwania będziemy używać oprogramowania typu open source . Jest łatwy do zbudowania ze źródła lub jeśli jesteś na Ubuntu, ma również PPA. Preferowane jest, jeśli zdobędziesz własną odpowiedź, ale jeśli nie wiesz, jak budować aplikacje C i nie uruchamiasz Debiana / Ubuntu, możesz pozwolić komuś innemu zdobyć dla ciebie. dssim
oczekuje wejścia / wyjścia w formacie PNG, więc najpierw przekonwertuj dane wyjściowe na format PNG, jeśli dane wyjściowe są w innym formacie.
Aby sprawić, by punktowanie było bezbolesne, oto szybki skrypt Pythona pomocnika, użycie 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)))
Najniższy wynik wygrywa.
You may assume that the image dimensions do not exceed 2^32 in either direction.
Czy to nie jest trochę przesadne? Oznacza to, że muszę użyć maksymalnie 16 bajtów do przechowywania pary współrzędnych (x, y). Niewiele plików graficznych ma wymiary większe niż 2 ^ 16 (65536) pikseli w dowolnym kierunku, a 2 ^ 11 jest wystarczające dla wszystkich obrazów w korpusie.
2^16
.