2013-03-07 17 views
5

Zajmuję się problemem zmniejszenia przestrzeni dyskowej podczas przechowywania razem wielu obrazów JPEG jako jednego większego obrazu. Podstawową intuicją jest to, że obrazy mają pewne podobieństwa (takie jak te wykonane w tym samym miejscu lub w tym samym punkcie czasowym) i czy możemy wykorzystać to podobieństwo, aby zaoszczędzić miejsce?Kompresja obrazu JPEG

Ogólny przepływ jest: wejściowe JPG Obrazy -> Każdy obraz przekształcony RGB płytki obraz -> Reorganizacja podobnych RGB płytki razem -> Ponownie przekształcić do formatu JPG. Naturalnie, podczas pobierania obrazów, będziemy musieli wykonać proces reverse.

Użycie współczynnika DC komponentu Y jako miary podobieństwa w przypadku reorganizacji płytek pozwoliło uzyskać około 8% oszczędności miejsca na 10 obrazów. Kiedy robię to dla 100 zdjęć, oszczędności są zmniejszone do ~ 3%.

  • Jak uzyskać oszczędności płytek po reorganizacji - czyli jaka część procesu kodowania JPEG wykorzystuje tego obrazu płytek reorganizacji?

  • Zamiast współczynnika stałego składnika Y jest, są tam jakieś inne metryki można myśleć, że będą lepiej wykorzystywane przez kodowanie JPEG


Revised:

Czy istnieje jakiś inne format obrazu poza JPG, który może lepiej wykorzystać to podobieństwo podobieństwo podczas agregowania wielu obrazów? Na przykład PNG?

Odpowiedz

5

Najprawdopodobniej używasz JFIF do kodowania.

Nie jestem pewien, jak można oczekiwać, że ta metoda zadziała. Jeśli dobrze rozumiem, dzielisz obrazy na płytki, łącząc je w jeden mega-obraz, z "podobnymi" kaflami ułożonymi blisko siebie.

AFAIK, implementacje JPEG tworzą oddzielny DCT dla pojedynczego kafelka 8x8 na obrazie, o nazwie: makroblok. Innymi słowy, JPEG nie może wykorzystać spójności między sąsiadującymi makroblokami (co wydaje się być podstawowym założeniem dla twojej techniki kompresji).

Jeśli Twoje własne płytki są większe niż makrobloki, nie zobaczysz żadnej poprawy poza oszczędnością miejsca w nagłówku obrazu.

Np .: 10 nagłówków obrazów JPG zastąpionych przez 1 da 90% oszczędności miejsca, ale tylko w nagłówku. Kiedy patrzysz na ogólny plik, nagłówek jest niewielką częścią całego pliku, więc twoje oszczędności są niewielkie. Po zastąpieniu 100 nagłówków obrazu przez 1, oszczędzasz 99%, ale ponownie tylko w nagłówku. W obu przypadkach wszystkie makrobloki są nadal kodowane i przechowywane dokładnie tak, jak poprzednio.

+0

Dzięki, to ma wiele sensu! Używam libjpeg do kodowania i dekodowania. Ponieważ JPEG wykonuje DCT w obrębie makrobloków 8x8, podobieństwo pomiędzy płytkami (większe niż makrobloki) prawdopodobnie niewiele pomaga. Sądzę jednak, że współczynniki DCT sąsiednich makrobloków są względnie zakodowane i można to w pewnym stopniu poprawić poprzez reorganizację tej płytki. Poprawiłem moje pytanie - proszę spojrzeć. – user655617

+0

Cieszę się, że mogę pomóc w wyjaśnieniu rzeczy. Tak, libjpeg jest referencyjną implementacją JFIF standardu JPEG. Nie pamiętam współczynników DCT z wykorzystaniem kodowania delta (wśród sąsiadujących makrobloków). AFAIR, każdy makroblok staje się pojedynczą macierzą współczynników 8x8, która jest następnie dziesiątkowana (podzielona w celu zmniejszenia liczby bitów potrzebnych do ich przechowywania - i tu dochodzi "strata" w stratnej kompresji) i odczytywana w zig -zag moda. Ta kolejność daje długie przebiegi 0s, które są efektywnie kompresowane poprzez kodowanie długości (zamiast 17 zer, przechowujemy 17, 0). –

2

Są dwa obszary, w których widać korzyści:

pierwsze, kiedy można umieścić podobne regiony obok siebie (zwłaszcza jeśli krawędzie obrazów dopasować się idealnie bez nieciągłości - choć będzie to bardzo rzadkie), część DCT (przestrzeń częstotliwościowa) części algorytmu jpeg działa poprzez progresywne przybliżanie dużych regionów (nie jest pewien, jaki jest największy rozmiar), a następnie przygląda się błędowi między przybliżeniem dużego regionu i wielu mniejszych regionów, i produkcja mają większą korektę lokalizacji.

Podejrzewam, że ten efekt jest niewielki, chyba że zdjęcia są podobne lub bardzo małe (tak, że ich krawędzie są długie proporcjonalnie do ich powierzchni).

drugie The Huffman coding część kompresji JPEG będą widzieć korzyści, ponieważ te same wzorce bitowe wydaje się w wielu sub-obrazów, a być skompresowane taka sama (krótka) token).

Ten aspekt nie zależy od tego, w jaki sposób kompresujesz obrazy - o ile są one na tym samym obrazie.

+0

Dzięki za odpowiedź! Nie jestem pewna co do twojej pierwszej części. Ale myślę, że kodowanie Huffmana może wykorzystać to do _some_ scope _if_ Podziel ostateczny wynik na wiele obrazów, każdy z podobnymi kaflami. Ale nie sądzę, że wyjaśnia to oszczędność miejsca, którą otrzymuję. Przeformułowałem moje pytanie - proszę spojrzeć. – user655617