Mozgáskompenzáció

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2018. március 11-én felülvizsgált verziótól ; az ellenőrzések 13 szerkesztést igényelnek .

A mozgáskompenzáció a videoadatok feldolgozásához és tömörítéséhez használt egyik fő algoritmus  . Az algoritmus a szomszédos képkockák hasonlóságát használja a videósorozatban, és megkeresi a kép egyes részeinek mozgásvektorait (általában 16x16 és 8x8 méretű blokkok). A kompenzáció használata lehetővé teszi a tömörítési arány többszöri növelését a tömörítés során a redundancia eltávolítása miatt a keretek illeszkedő részei formájában. Nemcsak tömörítésre, hanem videószűrésre, képkockasebesség változtatásra stb . is használható.

Az algoritmus ötlete

A tömörítés problémájának megoldása a digitális videó megjelenése óta kiemelt gondot jelent. Az értékeléshez vegyünk egy videósorozatot a következő paraméterekkel:

Ennek eredményeként 14,8 megabájtot vesz igénybe egy másodpercnyi ilyen videó rögzítése vagy továbbítása tömörítés nélkül, a hang- és szolgáltatásinformációk nélkül. Másfél órás film tárolásához már 79 920 megabájtra (78 gigabájtra ) lesz szükség.

Szinte minden videóban a szomszédos képkockák hasonlóak, közös objektumaik vannak, amelyek általában párhuzamosan mozognak. És teljesen természetes, hogy a videót úgy akarjuk kódolni, hogy az objektumokat ne kódolják sokszor, hanem egyszerűen leírják néhány elmozdulásukat.[ semlegesség? ]

Még ebben a példában is, ha a 0. képkockát és a képkockaközi különbség összes képét becsomagoljuk az archiválóba, akkor észrevehető[ mennyit? ] tömörítési nyereség. De ez a nyereség jelentősen növelhető.

Példa az algoritmus működésére

A mintafelismerő algoritmusok nagy számítási bonyolultsága és munkájuk elégtelen pontossága miatt különféle módszereket alkalmaznak a mozgásvektorok gyors megtalálására (természetesen nem veszteség nélkül).

1. Az aktuális keret betöltődik.
2. A keret blokkra van osztva (pl. 16×16).

3. A blokkok kiiktatásra kerülnek (ebben az esetben minden blokk külön-külön kerül feldolgozásra).
4. Egy blokk számlálásakor a blokk egy bizonyos környékét kihagyja a rendszer, hogy megkeresse a maximális megfelelést az előző képkockán lévő blokk képének ezen a környéken belül.

5. Így a keresés befejezése után vektorhalmazt kapunk, amely a képkockák közötti "mozgását" jelzi. Ezek a vektorok természetesen felhasználhatók egy olyan kompenzált képkocka képének létrehozására, amely jobban közelíti azt a képkockát, amelyhez a mozgáskompenzációt végrehajtották.

Megvalósítási problémák

Algoritmus írásakor felmerülhet a kérdés - "Hogyan értékelhető a képrészletek "hasonlósága"?". Néhány lehetőség:

A leggyakrabban használt számítás az SAD. A következő kérdés: "Hogyan keressük meg a kívánt blokkot?"

Megvalósítási példa

A nyers erő módszerének megvalósítása C++ nyelven

void ME ( BYTE * CurrentFrame , BYTE * PreviousFrame , int Width , int Height , MV * MotionVectors ) { int BlocksPerHeight = ( Magasság + 15 ) >> 4 ; //Blokok száma függőlegesen int BlocksPerWidth = ( Width + 15 ) >> 4 ; //A blokkok száma vízszintesen int VerticalOffset , HorizontalOffset , TempOffset ; // Eltolások int OffsetPerLine = Szélesség + Szegély * 2 ; //Egy sorral eltolás int StartOffset = OffsetPerLine * Border + Border ; //Kezdő eltolás BYTE * CurrPtr , * PrevPtr ; //Mutatók az előző és következő MV keretekre ProbMV ; // Próbavektor hosszú MinError , Error ; //Hiba értékek for ( int i = 0 ; i < BlocksPerHeight ; i ++ ) { for ( int j = 0 ; j < BlocksPerWidth ; j ++ ) { // Eltolások kiszámítása VerticalOffset = ( i << 4 ) * OffsetPerLine + StartOffset ; Vízszintes eltolás = ( j << 4 ); //Eltolások beállítása az aktuális blokkhoz CurrPtr = CurrentFrame + VerticalOffset + HorizontalOffset ; PrevPtr = Előző keret + Függőleges eltolás + Vízszintes eltolás ; MinError = MAXLONG ; //A hibát nagyon nagynak tartjuk for ( int y = - MaxMotion ; y < MaxMotion ; y ++ ) { TempOffset = y * OffsetPerLine ; //Mentés a szorzásoknál for ( int x = - MaxMotion ; x < MaxMotion ; x ++ ) { //GetError - blokk-összehasonlító funkció, pl. SAD Error = GetError ( CurrPtr , PrevPtr + TempOffset + x , OffsetPerLine ); //Új jelölt :) if ( Hiba < MinError ) { ProbMV . x = x ; ProbMV . y = y_ _ MinError = Hiba ; } } } //Írjuk fel a kapott vektort :) MotionVectors [ i * BlocksPerWidth + j ] = ProbMV ; } } }

Az újban[ mikor? ] Az MPEG -4 AVC/H.264 szabvány bevezette a nem négyzet alakú (téglalap alakú) blokkokat is, amelyek mérete akár 4×4 pixelre osztható . Így nagyon hatékonyan lehet használni a szomszédos képkockák hasonlóságát, és a blokkok bonyolultabb formája miatt a mozgáskompenzáció pontossága a mozgó objektumok határain megnő. A mozgáskompenzáció mellett a további képfinomításhoz (vagy az újonnan megjelenő területekhez, amelyek nem voltak az előző képkockákban) keretközi információtömörítést és független blokktömörítést alkalmaznak.

A tömörítés mellett a mozgáskompenzációt is aktívan használják[ kitől? ] a videószűrésben, különösen a kiváló minőségű szűrőbeállításoknál: deinterlacing ( interlacing to progresszív ), zajcsökkentés , képsebesség-változások és mások.

Lásd még

  • globális

Linkek