Kodowanie różnic było już omawiane przy okazji algorytmu DPCM w ramach kompresji stratnej dźwięku. Wtedy kodowaliśmy różnice względem sygnału estymowanego na wyjściu, dużym minusem tego podejścia jest niemożliwość swobodnego przewijania sygnału, ponieważ żeby odtworzyć wartość w konkretnym czasie musimy zrekonstruować cały sygnał. Dla sygnału audio zwykle nie jest to dla nas problem, ponieważ nie zajmuje on dużo miejsca w pamięci, jednak w przypadku sygnału wideo jest już to niestety dość problematyczne, ponieważ danych w jednej chwili jest dużo więcej. Rozwiązanie tego problemu są klatki kluczowe. Klatka kluczowa to klatka wzorcowa, do której są porównywane i na jej podstawie odtwarzane następujące po niej klatki filmu. Klatki kluczowe mogą być oddalone od siebie o stałą odległość, jak również mogą być rozmieszczone w sposób nierównomierny w zależności od kompresowanego materiału np. zmiany ujęcia. Klatki kluczowe mogą również być poddawane kompresji zarówno stratnej (redukcja chrominancji), jak i bezstratnej (RLE).

Kodowanie różnić to zwykła operacja odejmowania bieżących klatek od klatek źródłowych. Operację tą wykonujemy osobno dla każdej warstwy już po ewentualnej redukcji chrominancji. Nasze klatki mają wartości z zakresu \(<0,255>\), więc nasze różnice są w zakresie \(<-255,255>\), dlatego można również sprawdzić, czy daje coś kompresja tego zakresu podzielenie go przez 2 przed kompresją i pomnożenie razy 2 przy dekompresji co dałoby nam możliwość zapisania go na 8 bitach (lub przez 4 dla jeszcze mniejszej redukcji).

UWAGA, Jeżeli będą się pojawiały ‘duchy’ w odtwarzanym obrazie to operacje odejmowania wykonujecie w złej kolejności. Polecam odjąć klatkę kluczową od klatki bieżącej (Frame-Key), zamiast klatkę bieżącą od klatki kluczowej (Key-Frame).

Przykład

Zakładamy, że mamy dwie klatki \(I_k\) - klatka kluczowa oraz \(I_n\) - klatka kodowana:

\[ I_k=\begin{bmatrix} 20 & 34 & 58 \\ 18 & 25 & 33 \\ 230 & 28 & 0 \\ \end{bmatrix} \qquad I_n=\begin{bmatrix} 23 & 32 & 59 \\ 20 & 25 & 28 \\ 30 & 15 & 250 \\ \end{bmatrix} \]

Teraz musimy wyliczyć różnicę pomiędzy naszymi klatkami \(R\):

\[ R=I_n-I_k=\begin{bmatrix} 23 & 32 & 59 \\ 20 & 25 & 28 \\ 30 & 15 & 250 \\ \end{bmatrix}-\begin{bmatrix} 20 & 34 & 58 \\ 18 & 25 & 33 \\ 230 & 28 & 0 \\ \end{bmatrix}=\begin{bmatrix} 3 & -2 & -1 \\ 2 & 0 & -5 \\ -200 & -13 & 250 \\ \end{bmatrix} \]

Jak widać nasze \(R\) potrzebuje co najmniej jednego bitu więcej niż przestrzeń wartości dla jednej klatki, czyli do zapisu różnicy uint8 potrzebujemy w teorii int9. Dlatego możemy również podzielić różnicę przez wielokrotność liczby \(2\) (\(4,8,\dots\)), wtedy będziemy mieli możliwość zapisania danych na mniejszej liczbie bitów. Przygotujmy sobie 2 dodatkowe zmienne \(R\): \(R_2\) - podzielone przez \(2\) oraz \(R_4\) - podzielone przez \(4\)

\[ R_2=\Bigg\| \begin{bmatrix} 3 & -2 & -1 \\ 2 & 0 & -5 \\ -200 & -13 & 250 \\ \end{bmatrix}*\frac{1}{2} \Bigg\|=\ \begin{bmatrix} 2 & -1 & 1 \\ 1 & 0 & -3 \\ -100 & -7 & 125 \\ \end{bmatrix} \qquad\qquad R_4=\Bigg\| \begin{bmatrix} 3 & -2 & -1 \\ 2 & 0 & -5 \\ -200 & -13 & 250 \\ \end{bmatrix}*\frac{1}{4} \Bigg\|=\ \begin{bmatrix} 1 & -1 & 0 \\ 1 & 0 & -1 \\ -50 & -3 & 63 \\ \end{bmatrix}\\ \]

Jak widać duże wartości są znacząco mniejsze teraz spróbujmy odtworzyć nasze klatki \(O\) na podstawie różnic:

\[ O=I_k+R=\begin{bmatrix} 20 & 34 & 58 \\ 18 & 25 & 33 \\ 230 & 28 & 0 \\ \end{bmatrix}+\begin{bmatrix} 3 & -2 & -1 \\ 2 & 0 & -5 \\ -200 & -13 & 250 \\ \end{bmatrix}=\begin{bmatrix} 23 & 32 & 59 \\ 20 & 25 & 28 \\ 30 & 15 & 250 \\ \end{bmatrix} \]

\[ O=I_k+2*R_2=\begin{bmatrix} 20 & 34 & 58 \\ 18 & 25 & 33 \\ 230 & 28 & 0 \\ \end{bmatrix}+2*\begin{bmatrix} 2 & -1 & 1 \\ 1 & 0 & -3 \\ -100 & -7 & 125 \\ \end{bmatrix}=\begin{bmatrix} 20 & 34 & 58 \\ 18 & 25 & 33 \\ 230 & 28 & 0 \\ \end{bmatrix}+\begin{bmatrix} 4 & -2 & 2 \\ 2 & 0 & -6 \\ -200 & -14 & 250 \\ \end{bmatrix}=\begin{bmatrix} 24 & 32 & 60 \\ 20 & 25 & 27 \\ 30 & 14 & 250 \\ \end{bmatrix} \] \[ O=I_k+4*R_4=\begin{bmatrix} 20 & 34 & 58 \\ 18 & 25 & 33 \\ 230 & 28 & 0 \\ \end{bmatrix}+4*\begin{bmatrix} 1 & -1 & 0 \\ 1 & 0 & -1 \\ -50 & -3 & 63 \\ \end{bmatrix}=\begin{bmatrix} 20 & 34 & 58 \\ 18 & 25 & 33 \\ 230 & 28 & 0 \\ \end{bmatrix}+\begin{bmatrix} 4 & -4 & 0 \\ 4 & 0 & -4 \\ -200 & -12 & 252 \\ \end{bmatrix}=\begin{bmatrix} 24 & 30 & 58 \\ 22 & 25 & 29 \\ 30 & 16 & 252 \\ \end{bmatrix} \\ \]

Odtworzone klatki nie różnią się w znaczący sposób między sobą wartościami.