Jak działają wektory ruchu w kodowaniu predykcyjnym dla MPEG?

16

W MPEG istnieje proces polegający na rozbiciu obrazu na makrobloki i obliczeniu wektora ruchu dla każdego z tych makrobloków. Następnie przekazujesz te wektory wraz z błędami prognozowania, aby zrekonstruować następny obraz w sekwencji wideo.

Staram się dobrze zrozumieć, jak to działa. Każdy makroblok ma powiązany z nim wektor ruchu, który (jeśli wektor ma wartość [1,0]), mówi: all the pixels in this block move 1 in the x direction and 0 in the y direction for the next frame. Jeśli wszystkie wektory ruchu nie są wyrównane poprawnie, nie spowoduje to, że obszary obrazu nie zostaną policzone (jak obszar, w którym ten makroblok był na pierwszym miejscu)?

Na przykład znalazłem następujące pytanie.

Rozważ następujący obraz w czasie t:

7   7   7   7           
7   7   5   5        
7   5   5   8         
8   8   8   8           
9   9   9   9       
9   9   9   9

Ten obraz został podzielony na 2x2 makrobloki i wysłano następujące wektory ruchu w celu jego odtworzenia:

(0,0)  (0,0)  (0,1)  (-1,1)  (0,0)  (0,0)

Obraz z poprzedniego kroku czasu, t - 1, wyglądał tak:

7   7   7   7           
7   7   5   4        
7   7   7   7         
7   5   8   8           
8   9   8   9       
9   9   9   9   

Jakie błędy zostały przesłane?

Jak byś to rozwiązał?

Portfel
źródło

Odpowiedzi:

5

Aby uprościć zamieszanie - istnieją dwa procesy:

1. Szacowanie
ruchu 2. Kompensacja ruchu

Zanim porozmawiamy o oszacowaniu, powinniśmy porozmawiać o kompensacji ruchu.

Powiedzmy, że jest podzielony na blok B l o c k s t [ k ] ( x , y ) .Imaget(x,y)Blockst[k](x,y)

Zadaniem kompensacji ruchu jest wytworzenie z dowolnego obszaru I m a g e t - 1 ( x , y ) .Blockst[k](x,y)Imaget1(x,y)

Zatem inny blok niekoniecznie wyrównany na granicy 16 x 16 jest najlepszym możliwym dopasowaniem Blockst1[k](x+mx,y+my)

Tutaj nazywane są wektorami ruchu.mx,my

Możemy obliczyć błąd między celem a odniesieniem jako

Errt[k](x,y)=Blockst[k](x,y)Blockst1[k](x+mx,y+my)

Teraz, koder zasadniczo przenoszą (z DCT i kwantyzacji) i ( m x , m y ) [ k ] dla każdego bloku ,.Errt[k](x,y)(mx,my)[k]

Zatem enkoder ma do wykonania 2 prace:

1. Ruch Oszacowanie
Proces lub oszacowanie dla wszystkich K tak, że e r r T [ k ] ( x , y ) jest zminimalizowane nazywa szacowania ruchu.mx,my[k]kErrt[k](x,y)

2. Generowanie obrazu błędu po kompensacji ruchu
Proces konstruowania z I t pikseli obrazu i ( m x , m y ) [ k ] nazywa się kompensacją ruchu . Obraz błędu jest przesyłany.Blockst[k](x,y)It(mx,my)[k]

Wreszcie dekoder może samodzielnie wykonać kompensację ruchu za pomocą wektorów moitonowych i obrazu błędu, aby dokonać ostatecznej rekonstrukcji obrazu.

Teraz zdajemy sobie sprawę z kilku punktów:

  1. Szacowanie Best Motion pomaga zminimalizować energię, która jest wymagana do przesłania, a tym samym optymalizuje bity dla danej jakości.

  2. Jednak nawet jeśli nie jest idealny lub jeśli scena ma znaczącą zmianę w stosunku do ostatniego obrazu, E r r t [ k ] ( x , y ) jest zawsze przesyłane do odbiornika - stąd rekonstrukcja jest zawsze idealny (modulo strata spowodowana kwantyzacją). Dlatego nawet jeśli masz suboptymalny wektor ruchu lub redundancja nie jest duża, rekonstrukcja jest zawsze idealna, choć z większą ilością bitów!(mx,my)[k]Errt[k](x,y)

  3. Każdy blok jest kompensowany ruchem sam w sobie - dlatego nawet jeśli rzeczywiste wektory ruchu sąsiednich bloków nie mają wpływu na konstrukcję. Dlatego nie jest konieczne, aby wektory ruchu były idealnie wyrównane, aby możliwa była idealna rekonstrukcja.Blockst[k](x,y)

  4. Chociaż istnieje algorytm, który jest wystarczająco inteligentny, aby zgadywać, że jeśli ma wektor ruchu ( m x , m y ) [ k ] zgadnij, że B l o c k s t [ k + 1 ] może tylko bądź do tego bliżej.Blockst[k](mx,my)[k]Blockst[k+1]

  5. Na koniec załóżmy, że następny obraz jest zupełnie inny, możliwe, że energia dla .

    Energy(Errt[k](x,y))>Energy(Blockst[k](x,y))

W takich przypadkach bardziej wskazane może być przesłanie bloku bezpośrednio bez przewidywania, niż przesłanie różnicy. Jest to również możliwe w enkoderze dzięki przepisowi zwanemu blokiem INTRA.

Dipan Mehta
źródło
3

Nie, nie pozostawi dziur, ponieważ wektor pochodzi z nieznanej ramki (P lub B) do znanej ramki (I-ramka). Przypomina trochę o tym, w jaki sposób obliczyć transformację obrazu - używasz transformacji wstecznej, aby uniknąć dziur /

Andrey Rubshtein
źródło
3

B(i,j)i={0,1,2}j={0,1}(2i,2j)

(0,0) (0,2)
(2,0) (2,2)
(4,0) (4,2)

M(i,j)

(0,0) (0,0)
(0,1) (-1,1)
(0,0) (0,0)

B(i,j)=B(i,j)+M(i,j)

(0,0) (0,2)
(2,1) (1,3)
(4,0) (4,2)

B(i,j)B(i,j)

Uwaga: Nie jesteśmy chronieni przed jakimkolwiek nakładaniem się bloku „w ruchu” (dwa bloki są przenoszone do nakładających się lokalizacji). Istnieją sposoby, aby sobie z tym poradzić, ale wykracza to poza zakres tej odpowiedzi. Na razie zamierzamy przepisać dowolne piksele blokiem, który przenosimy do ich lokalizacji, aby nawet jeśli wcześniej były tam przenoszone bloki, zostaną one nadpisane.

B(i,j)B(i,j)Fe

7 7 7 7
7 7 5 7
7 7 7 8
7 5 5 8
8 9 8 9
9 9 9 9

EFeFE=FFe

0 0 0 0           
0 0 0–3        
0 0 0 -1         
0 0 3 0           
0 0 0 0       
0 0 0 0
Phonon
źródło
Chociaż myślę, że społeczność przetwarzająca sygnały jest zdecydowanie najlepszym miejscem do postawienia tego pytania, jednak takie tematy i głęboko zaangażowane technologie wokół tego potrzebują własnej przestrzeni. Pojawiła się nowa propozycja strony z pytaniami Technologie nadawcze i medialne Proszę dołączyć i przyczynić się.
Dipan Mehta
@DipanMehta Very cool! =)
Fonon