Bezstratnie kompresowanie podobnych obrazów?

10

Muszę zmniejszyć rozmiar mojej biblioteki zdjęć, więc naturalnie chcę je skompresować. Wiele z nich nie jest do końca identycznych, ale wciąż bardzo podobnych (kolejne ujęcia tej samej sceny). Czy istnieje algorytm kompresji, który wykorzystuje ten fakt do skutecznego kompresowania tych obrazów? 7zip (LZMA) jest bezużyteczny.

Erik
źródło

Odpowiedzi:

11

Możesz spróbować Paq 8 (fp8_v2.zip). Właśnie próbowałem tego na 1440 podobnych obrazach PNG, a następnie na 111 podobnych obrazach JPG. Oto wyniki.

  • 1440 plików PNG, 28 631 615 bajtów => skompresowanych 2 058 653 bajtów
  • 111 plików JPG, 15 003 820 bajtów => 489,096 bajtów skompresowanych

Kompresja plików PNG zajęła około 8 minut i 550 MB pamięci przy użyciu:

fp8_v2.exe -7 images *.png

Kompresja plików JPG zajęła około 5 minut i 125 MB pamięci przy użyciu:

fp8_v2.exe -5 images image12*.jpg

Zobacz także: bezstratny test kompresji obrazu jpg

jftuga
źródło
Kompresja 97% dla plików JPG wydaje się nierealna. Liczby w teście porównawczym, które podałeś, aby powiedzieć, że kompresja wynosi około 20%
OneSolitaryNoob
@OneSolitaryNoob Czy zapomniałeś, że pliki JPEG są podobne? 110/111 = oczekiwana 99,1% kompresja. Test porównawczy, który podłączył, dotyczy kompresji jednego pliku JPEG.
Navin
@Navin to naprawdę mało prawdopodobne. Nawet jeśli wyglądają prawie identycznie, większość pikseli będzie się nieco różnić.
OneSolitaryNoob
@OneSolitaryNoob Co z tego? 1 sekundę wideo (30 klatek) można skompresować do rozmiaru mniej więcej takiego samego jak pojedyncza klatka. Tak długo, jak niewielka różnica stanowi niewielki ułamek danych, wszyscy jesteście dobrzy.
Navin,
@Navin, to kompresja stratna, wiele szczegółów zniknęło, ale większość ludzi tego nie zauważy. Paq * to kompresja bezstratna
OneSolitaryNoob
1

Wyobrażam sobie, że transformacja nory z koderem arytmetycznym byłaby idealna do tego, biorąc pod uwagę wystarczająco duże okno. Co się stanie, jeśli skonfigurujesz BZIP2 do używania rozmiaru bloku równego niewielkiemu ciągowi zdjęć? Będzie wolniejszy i zajmie więcej pamięci, ale współczynnik kompresji powinien gwałtownie wzrosnąć. A czy próbowałeś już LZMA z większymi rozmiarami bloków?

Peter Hanneman
źródło
1

Oto proste rozwiązanie, które nie działa w przypadku zdjęć, ale może działać, jeśli jeden ma kilka obrazów z dużymi identycznymi obszarami piksel po pikselu: zapisz obrazy w rozpakowanym formacie, takim jak BMP (nie PNG lub GIF), a następnie TAR i skompresuj z przyzwoitym kompresorem, takim jak XZ, np. w systemie Linux z czymś takim

tar -c myDirectory | xz -9 >myDirectory.tar.xz

Zamiast TAR i XZ można użyć 7-Zip z opcją „solidnego archiwum”, aby uzyskać mniej więcej taką samą wydajność. W ten sposób mogłem skompresować 16 podobnych zrzutów ekranu, które po zapisaniu jako osobne pliki PNG zajmowały około 900 KB, do archiwum 2 MB. Zaletą tego rozwiązania jest to, że wykorzystuje popularne formaty plików, dzięki czemu działa bez instalowania nowego oprogramowania. (Niestety starsze i jeszcze bardziej popularne programy GZIP i BZIP2 nie wykonały dla mnie dobrej roboty - być może dlatego, że rozmiar bloku BZIP2 nie może być skonfigurowany tak, aby był większy niż 900 KB.)

Jaan
źródło
0

Nie to, że widziałem. Prawdopodobnie najbliższą rzeczą byłoby pobranie kilku podobnych plików JPEG i umieszczenie ich w filmie MJPEG. Możesz również użyć APNG lub animowanych plików GIF w podobnym celu.

Nie jestem jednak pewien, jak dobrze by to działało, i wygląda na to, że mówisz już o zrzutach ekranu z filmu, więc ponowne ich zapakowanie do pliku filmowego brzmi ... nieproduktywnie.

Być może lepszym sposobem, jeśli nadal masz klipy, z których pochodzą ekrany, byłoby po prostu znalezienie narzędzia wiersza polecenia, które może wyodrębnić dla ciebie dokładną ramkę, skopiować ten unikalny identyfikator do pliku tekstowego w dowolnym miejscu, a wtedy zawsze możesz łatwo ponownie wyciągnij ramkę, gdy jej potrzebujesz.

afrazier
źródło
GIF nie nadaje się do kompresji zdjęć, a animowany GIF jest jeszcze mniejszy. Nawet kompresja zdjęć do wideo MJPEG nie wydaje się przydatna, ponieważ przywracanie pojedynczych zdjęć byłoby trudne.
Martin
Nie powiedziałem, że to dobry pomysł ... :-) Ostatecznym pomysłem było umieszczenie zdjęć w animowanym wariancie ich oryginalnego formatu.
afrazier