Strona głównaArtykułyAlgorytmy

DCT Image Compression: Matematyka stojąca za JPEG

Jedna transformacja, zastosowana do bloków 8x8 pikseli, koncentruje prawie całą informację zawartą w obrazie w niewielkiej liczbie liczb – resztę można z grubsza odrzucić bez strat.

mysimulator teamZaktualizowano — czerwiec 2026≈ 8 min czytania▶ Otwórz symulację

Od pikseli do częstotliwości

Zdjęcie zapisane w postaci surowej to siatka niezależnych wartości jasności bez oczywistej redundancji do wykorzystania piksel po pikselu. Jednak, gdy podzielimy je na małe bloki 8x8, pojawia się coś użytecznego: większość naturalnych bloków obrazowych jest zdominowana przez wolne, gładkie zmiany w jasności z jedynie sporadycznymi ostrymi krawędziami. Przemiana dyskretna kosinusowa ponownie wyraża blok nie jako 64 wartości pikseli, ale jako 64 współczynników częstotliwości przestrzennych – jak duża część wzoru bloku przypomina wolno zmieniającą się falę cosinusa w porównaniu z szybko oscylującą, zarówno w poziomie, jak i pionie.

Wzór DCT-II

JPEG wykorzystuje dwuwymiarową DCT-II, stosowaną jako transformata 1D wzdłuż rzędów a następnie kolumn. Wersja 1D dla N próbek wygląda następująco:

X_k = 2 * sum_{n=0}^{N-1} x_n * cos( pi/N * (n + 0.5) * k ), k = 0..N-1 X_0 = składnik DC — proporcjonalny do średniej wartości wszystkich x_n X_1..X_N-1 = składniki AC — o rosnącej częstotliwości przestrzennej Zastosowana w dwóch wymiarach do bloku 8x8, generuje siatkę 8x8 współczynników, gdzie element narożny górno-lewy reprezentuje średnią jasność bloku, a współczynniki dalej po prawej i w dół odpowiadają rosnącym częstotliwościom poziomych i pionowych. Ponieważ DCT jest ortogonalna i wykorzystuje jedynie prawdziwe kosinusy (nie złożone eksponencje, jak blisko spokrewniona transformata Fouriera), unika zbędnego symetrycznego spektrum, które generowałaby transformata Fouriera dla danych obrazów o wartościach rzeczywistych — co było jednym z powodów jej wyboru zamiast FFT do tego zadania.

X_k = 2 * sum_{n=0}^{N-1} x_n * cos( pi/N * (n + 0.5) * k ),   k = 0..N-1

X_0        = the DC term  — proportional to the average of all x_n
X_1..X_N-1 = AC terms     — increasing spatial frequency
demo na żywo · powiązana symulacja● LIVE

Kompresja energii: dlaczego to działa

Dla typowego bloku fotograficznego, DCT koncentruje większość energii sygnału w niskoprzyswajalnych obszarach w pobliżu terminu DC, pozostawiając większość koeficientów o wysokiej częstotliwości małych lub skutecznie zerowych. Ta właściwość, zwana kompresją energii, jest głównym powodem użyteczności transformacji do kompresji: zamiast przechowywać około 64 liczby o zbliżonej wadze, można przechowywać kilka dużych koeficientów precyzyjnie, a pozostałe przybliżyć – lub je usunąć – z niewielką stratą jakości wizualnej.

Kwantyzacja: gdzie faktycznie zachodzi kompresja

Transformata Dyskretna Fouriera (DCT) sama w sobie jest bezstratna (do zaokrągleń) – zmienia jedynie reprezentację. Straty wprowadza kwantyzacja: każdy współczynnik jest dzielony przez wartość z tabeli kwantyzacji 8x8 i zaokrąglany do najbliższej liczby całkowitej. Wartości w tabeli rosną w kierunku krawędzi wysokich częstotliwości, ponieważ ludzkie oko jest znacznie mniej wrażliwe na drobne szczegóły o wysokiej częstotliwości niż na szerokie cieniowanie o niskiej częstotliwości; dlatego te współczynniki mogą być kwantyzowane grubsze – często do zera – przy niewielkiej utraconej percepcji. „Poziom jakości” w kodującym JPEG skaluje tę tabelę: wyższa jakość oznacza bardziej precyzyjną (mniejszy dzielnik) kwantyzację i więcej współczynników, które przetrwają bez zmian.

Skan podziałkowy i kodowanie entropijne

Po kwantyzacji większość typowych 64 współczynników bloku jest zerowa, zgrupowana w rogu o wysokiej częstotliwości. JPEG odczytuje współczynniki w kolejności podziałkowej, która zwiększa całkowitą częstotliwość, przekształcając ten róg zer na jeden długi ciąg — idealny dla kodowania długości sekwencji, a następnie dalej kompresowany za pomocą kodowania Huffmana. Połączenie DCT, agresywnej kwantyzacji wysokiej częstotliwości oraz kodowania długości sekwencji i Huffmana osiąga typowo stosunek 10:1 przy minimalnej widocznej utracie jakości, a znacznie wyższe proporcje kosztem widocznych artefaktów blokujących.

Często zadawane pytania

Dlaczego JPEG używa bloków 8x8 zamiast transformować całe obraz w jednym kroku?

Blok 8x8 jest wystarczająco mały, aby lokalny zawartość obrazu była często stosunkowo gładka, co koncentruje energię w niewielu współczynnikach, a jednocześnie pozwala utrzymać tanie obliczenia i sprzęt DCT. Całkowita transformacja obrazu (stosowana przez kodeki oparte na fali, takie jak JPEG2000) może zapewnić lepsze kompresję, ale wiąże się z znacznie wyższymi kosztami obliczeniowymi i złożonością oraz sprawia, że charakterystyczny blokowy podejście JPEGa stanowi celowe rozważenie stosunku kosztów do jakości, a nie pomyłkę.

Dlaczego współczynnik DCT na lewo w górnym rogu ma tak duże znaczenie?

Współczynnik na lewo w górnym rogu (wartość DC) reprezentuje średnią jasność całego bloku 8x8 – brak zmian przestrzennych w obu kierunkach. Naturalne obrazy są zdominowane przez obszary o zmienności, dlatego ta pojedyncza liczba zwykle przenosi więcej energii niż którykolwiek z pozostałych 63 współczynników AC, dlatego JPEG koduje go oddzielnie i przewiduje go na podstawie wartości DC poprzedniego bloku.

Dlaczego obrazy JPEGa o niskiej jakości wykazują widoczne kwadratowe bloki?

Wynika to z tego, że kompresja jest stosowana niezależnie do każdego bloku 8x8. Agresywne kwantyzowanie przy ustawieniach niskiej jakości może pozostawić sąsiednie bloki z różnymi średnimi jasnościami lub kolorami po usunięciu wysokich częstotliwości, co sprawia, że granice bloków stają się widoczne jako siatka. Ten artefakt blokowy jest bezpośrednim wizualnym znakiem rozpoznawczym projektu DCT opartego na blokach.

Wypróbuj na żywo

Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz DCT Image Compression i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.

▶ Otwórz symulację DCT Image Compression

Co znalazłeś?

Dodaj kroki odtworzenia (opcjonalnie)