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
.Odpowiedzi:
Python z PIL, wynik 0,094218
Kompresor:
Dekompresor:
Oba skrypty pobierają dane wejściowe za pomocą argumentów wiersza poleceń jako dwa katalogi (wejściowy i wyjściowy) i konwertują wszystkie obrazy w katalogu wejściowym.
Chodzi o to, aby znaleźć rozmiar, który mieści się poniżej 4 KiB i ma taki sam współczynnik kształtu jak oryginał, i użyć filtra Lanczos, aby uzyskać jak najwyższą jakość obrazu o zmniejszonej próbce.
Album Imgur skompresowanych obrazów po zmianie rozmiaru do oryginalnych wymiarów
Wynik skryptu oceniania:
źródło
Java (wanilia, powinna współpracować z java 1.5+), wynik 0,672
Nie generuje szczególnie dobrych wyników dssim, ale moim zdaniem tworzy bardziej przyjazne dla ludzi obrazy ...
Album: http://imgur.com/a/yL31U
Wynik skryptu oceniania:
Łańcuch kompresji:
Aby zdekompresować, napompować, a następnie odczytać indeksy bloków i wyprowadzić odpowiednią poprawkę do pliku wyjściowego, a następnie zmienić rozmiar do oryginalnych wymiarów.
Niestety kod jest zbyt duży, aby można go było przepełnić, dlatego można go znaleźć na stronie https://gist.github.com/anonymous/989ab8a1bb6ec14f6ea9
Biegać:
Przy pierwszym uruchomieniu tej aplikacji wymagane pliki zostaną wygenerowane i zapisane w katalogu w odniesieniu do katalogu roboczego wykonywania. To może zająć parę minut. W przypadku kolejnych wykonań ten krok nie będzie musiał zostać wykonany.
źródło