2011-12-28 7 views
5

Muszę zmniejszyć i rozpakować zestaw obrazów JPG o rozmiarze 4608 x 3456. Obecnie udało mi się już prawidłowo zdekompresować obrazy do formatu RGB i przekonwertować je na bitmapę.Skalowanie JPG podczas dekompresji JPG

Teraz potrzebuję wprowadzić niższy poziom, a z tego, co dotychczas przeczytałem, aby poprawnie zeskalować obraz, należy użyć interpolacji bilinowej. Następnie powinienem zastąpić piksele (2x2), które zostały użyte do interpolacji przez wynikowy piksel z interpolacji. Potrzebuję około około 1/4 obecnego rozmiaru.

Nie martwię się jakością zdjęć o obniżonej skali, ponieważ zależy mi na szybkości, z jaką jest wykonywana. Cały proces powinien być tak szybki, jak tylko może być.

Moje pytanie brzmi: , gdy powinienem wykonać interpolację dwuliniową podczas fazy dekompresji JPG. Czy powinienem to zrobić po IDCT (Inverse Discrete Cosine Transform), czy też powinienem wykonać interpolację przed IDCT?

Czy mądrze jest używać współczynników DCT i interpolować je, a następnie wykorzystać te wartości w IDCT?

+0

Kto powiedział, że powinieneś użyć bilinear? To najgorsza z możliwych metod oprócz punktowego pobierania próbek. Należy również zwrócić uwagę na prawidłową obsługę gamma. –

+0

@AxelGneiting To było tylko to, co znalazłem w moich badaniach, jeśli możesz zaproponować lepszy sposób, zrób to. –

+0

@AxelGneiting, w tej konkretnej aplikacji bilinear będzie matematycznie równoważny do podjęcia średnio wszystkich 4 pikseli. To powinna być bardzo szybka i akceptowalna jakość. Możliwe jest uzyskanie wyższej jakości kosztem prędkości. To samo dotyczy manipulowania gamma - lepsze wyniki, mniejsza szybkość. –

Odpowiedz

3

Ogólnie nie sądzę, że istnieje jakiś rozsądny sposób, w jaki można to zrobić, biorąc pod uwagę współczynniki DCT.

Jeśli jednak chcesz mieć obraz o połowę mniejszej wielkości w każdym wymiarze, możesz uzyskać obraz z grubsza w dół, odrzucając współczynniki wysokiej częstotliwości i wykonując 4xCT IDCT.

+0

To nie jest taki niedorzeczny pomysł - pracowałem z biblioteką, która używała tego podejścia do generowania miniatur. Niestety nigdy nie poznałem szczegółów tego, jak działał. –

+0

@ Czy możesz podać mi więcej danych na temat tego, jak to zrobić? –

+1

@ Tony: Każdy blok 8x8 obrazu ma nałożony DCT 2D (jestem pewien, że już to wiesz). Każdy współczynnik reprezentuje amplitudę określonej częstotliwości przestrzennej 2D. Chcesz spekulować, co zasadniczo polega na odfiltrowaniu najpierw wysokich częstotliwości (tak robi interpolacja). Można uzyskać podobny efekt, ustawiając współczynniki wysokiej częstotliwości na 0. Alternatywnie, możesz po prostu zignorować je i zachować tylko najniższe freq 4x4 z każdego bloku i wykonać na nich 4x4 IDCT (zobacz stronę Wikipedii na DCT dla matematyki). –