JPG. Algorytm kompresji

Witam ponownie! Znalazłem ten artykuł napisany w maju 2019 r. Jest to kontynuacja serii artykułów o WAVE i JPEG, dostępnych tutaj pierwszy. W publikacji tej zostaną zawarte informacje dotyczące algorytmu kodowania obrazu oraz samego formatu jako całości.

Szczypta historii

Łyżka artykułu z Wikipedii:

JPEG (Joint Photographic Experts Group) to jeden z popularnych formatów grafiki rastrowej używany do przechowywania zdjęć i podobnych obrazów.

Standard ten został opracowany przez Joint Photographic Experts Group w 1991 roku w celu zapewnienia wydajnej kompresji obrazu.

Jak obrazy przechodzą z formatu RAW do JPEG?

Niektórzy uważają, że obrazy JPEG to surowe dane skompresowane metodą Huffmana, ale nie jest to prawdą. Przed kompresją sterowania dane pokonują długą drogę.

Po pierwsze, model kolorów zostaje zmieniony z RGB na YCbCr. Istnieje nawet specjalny algorytm do tego - tutaj. Y nie zostanie dotknięte, ponieważ odpowiada za jasność, a jego zmiana będzie zauważalna.

Pierwszą rzeczą związaną z obrazem jest "rębnia" (podpróbkowanie). Łatwo to zrozumieć: pobierana jest tablica pikseli 2x2, następnie pobierane są Cb i Cr - średnie wartości każdego ze składników YCbCr tych 4 pikseli. Więc, wygraliśmy 6 bajtów, zamiast 4 Y, 4 Cb, 4 Cr otrzymaliśmy 4 Y i tyle samo Cb i Cr dla każdego z nich (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). Nawet w skali 2x2 kompresja stratna przy współczynniku kompresji 2:1 brzmi solidnie. Dotyczy to całego obrazu. I tak - spadły o pół rozmiaru. I możemy zastosować tę technikę dzięki naszej percepcji kolorów. Osoba z łatwością zauważy różnicę w jasności, ale nie w kolorze, jeśli zostanie ona uśredniona dla małego bloku pikseli. Ścienienie można również wykonać liniowo, 4 piksele w poziomie i pionie. Pierwsza opcja jest używana częściej. Jeśli jakość obrazu jest ważna, wówczas w ogóle nie przeprowadza się dziesiątkowania.
Wizualna ilustracja przerzedzania (Habr nie pozwolił mi wstawić gifa) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

Główna część przygotowań

Dkp

Teraz następuje najtrudniejsza i najbardziej konieczna część. Cały obraz jest podzielony na bloki 8x8 (wypełnienie stosuje się, jeśli rozdzielczość nie jest wielokrotnością boku bloku).

Teraz zastosuj się do każdego bloku DCT (dyskretna transformata kosinusowa). W tej części ze zdjęcia usuwa się wszystko, co niepotrzebne. Korzystając z DCT trzeba zrozumieć, czy dana bryła (8×8) opisuje jakąś monotonną część obrazu: niebo, ścianę; lub zawiera złożoną strukturę (włosy, symbole itp.). Logiczne jest, że 64 piksele o podobnym kolorze można opisać tylko przez 1, ponieważ rozmiar bloku jest już znany. Tyle o kompresji: 64 do 1.

DCT zamienia blok w widmo, a tam, gdzie odczyty zmieniają się gwałtownie, współczynnik staje się dodatni, a im ostrzejsze przejście, tym wyższa będzie moc wyjściowa. Tam, gdzie współczynnik jest większy, na obrazie widać wyraźne przejścia barwy i jasności, gdzie jest niższy – słabe (płynne) zmiany wartości składników YCbCr w bloku.

Kwantyzacja

Ustawienia kompresji są już tutaj zastosowane. Każdy ze współczynników w każdej z macierzy 8x8 jest dzielony przez określoną liczbę. Jeśli po wszystkich jego modyfikacjach nie obniżysz jakości obrazu, to dzielnik powinien wynosić jeden. Jeśli ważniejsza jest dla Ciebie pamięć zajmowana przez to zdjęcie, to dzielnik będzie większy od 1, a iloraz zostanie zaokrąglony. Okazuje się, że po zaokrągleniu często kończy się na dużej liczbie zer.

Kwantyzacja ma na celu stworzenie możliwości jeszcze większej kompresji. Oto jak to wygląda na przykładzie kwantyzacji wykresu y = sin(x):

JPG. Algorytm kompresji

kompresja

Najpierw przechodzimy przez macierz zygzakiem:

JPG. Algorytm kompresji

Otrzymujemy jednowymiarową tablicę z liczbami. Widzimy, że jest w nim dużo zer, można je usunąć. W tym celu zamiast ciągu wielu zer wpisujemy 1 zero, a po nim liczbę wskazującą ich numer w ciągu. W ten sposób możesz zresetować do 1/3 rozmiaru całej tablicy. Następnie po prostu kompresujemy tę tablicę za pomocą metody Huffmana i zapisujemy ją w samym pliku.

Gdzie używany

Wszędzie. Podobnie jak PNG, JPEG jest używany w aparatach fotograficznych, systemach operacyjnych (jako logo firmy, ikony aplikacji, miniatury) i we wszystkich możliwych obszarach, w których obrazy muszą być efektywnie przechowywane.

Wniosek

W tej chwili wiedza o JPEG jest już cenna tylko w celach edukacyjnych, bo jest już wszędzie wbudowana i zoptymalizowana przez duże grupy ludzi, ale granit nauki nadal smakuje.

Źródła informacji

Artykuł o YCbCr w Wikipedii
Artykuł w Wikipedii na temat JPEG
Trochę o PrEP z postu Pikabu
Artykuł w Wikipedii na temat PrEP

Źródło: www.habr.com

Dodaj komentarz