Liikekompensointi

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 11. maaliskuuta 2018 tarkistetusta versiosta . tarkastukset vaativat 13 muokkausta .

Liikekompensointi on yksi tärkeimmistä videodatan käsittelyssä ja pakkaamisessa käytetyistä algoritmeista  . Algoritmi käyttää videosekvenssin naapurikehysten samankaltaisuutta ja löytää kuvan yksittäisten osien liikevektorit (yleensä 16x16 ja 8x8 lohkot). Kompensoinnin käyttö mahdollistaa puristussuhteen toistuvan lisäämisen pakkaamisen aikana redundanssin poistamisen vuoksi kehysten yhteensopivien osien muodossa. Käytetään paitsi pakkaamiseen, myös videon suodattamiseen , kuvanopeuden muuttamiseen jne.

Algoritmin idea

Pakkausongelman ratkaiseminen on ollut ensiarvoisen tärkeä asia digitaalisen videon tulon jälkeen. Otetaan arviointia varten videojakso seuraavilla parametreilla:

Tämän seurauksena yhden sekunnin tällaisten videoiden tallentaminen tai lähettäminen ilman pakkausta kestää 14,8 megatavua , ääni- ja palvelutietoja pois lukien. Puolentoista tunnin elokuvan tallentamiseen tarvitaan jo 79 920 megatavua (78 gigatavua ).

Lähes kaikissa videoissa vierekkäiset kehykset ovat samanlaisia, niillä on yhteisiä objekteja, jotka yleensä liikkuvat rinnakkain. Ja on aivan luonnollista haluta koodata video siten, että esineitä ei koodata monta kertaa, vaan osa niiden siirtymistä kuvataan yksinkertaisesti.[ neutraalius? ]

Jopa tässä esimerkissä, jos otamme ja pakkaamme 0. kehyksen ja kaikki kuvat kehysten välisestä erosta arkistaattorin kanssa, saamme huomattavan[ kuinka paljon? ] puristusvahvistus. Mutta tätä voittoa voidaan lisätä merkittävästi.

Esimerkki algoritmin toiminnasta

Kuviontunnistusalgoritmien suuren laskennallisen monimutkaisuuden ja niiden työn riittämättömän tarkkuuden vuoksi liikevektoreiden nopeaan löytämiseen käytetään erilaisia ​​menetelmiä (luonnollisesti, ei ilman häviötä).

1. Nykyinen kehys ladataan.
2. Kehys on jaettu lohkoihin (esim. 16×16).

3. Lohkot ohitetaan (tässä tapauksessa jokainen lohko käsitellään erikseen).
4. Laskettaessa yhtä lohkoa, lohkon tietty naapurusto ohitetaan etsimään maksimivastaavuutta edellisen kehyksen lohkon kuvaan kanssa tässä naapurustossa.

5. Siten, kun haku on suoritettu, saamme joukon vektoreita, jotka osoittavat kuvalohkojen "liikkeen" kehysten välillä. Näiden vektoreiden avulla voidaan luonnollisesti luoda kuva kompensoidusta kehyksestä, joka vastaa paremmin sitä kehystä, jolle liikekompensointi suoritettiin.

Toteutusongelmat

Algoritmia kirjoitettaessa voi syntyä kysymys - "Kuinka arvioida kuvafragmenttien "samankaltaisuutta"?". Jotkut vaihtoehdoista:

Yleisimmin käytetty laskentatapa on SAD. Seuraava kysymys on: "Kuinka etsitään haluttu lohko?"

Toteutusesimerkki

Raaka voima -menetelmän toteutus C++:ssa

void ME ( BYTE * CurrentFrame , BYTE * PreviousFrame , int Width , int Height , MV * MotionVectors ) { int BlocksPerHeight = ( Korkeus + 15 ) >> 4 ; //Lohkojen lukumäärä pystysuunnassa int BlocksPerWidth = ( Width + 15 ) >> 4 ; //Lohkojen lukumäärä vaakasuunnassa int VerticalOffset , HorizontalOffset , TempOffset ; // Siirtymät int OffsetPerLine = Leveys + Reunus * 2 ; //Yhden rivin siirtymä int StartOffset = OffsetPerLine * Border + Border ; // Alkupoikkeama BYTE * CurrPtr , * PrevPtr ; //Osoittimia edellisiin ja seuraaviin MV -kehyksiin ProbMV ; //Kokeiluvektori pitkä MinError , Error ; //Virhearvot for ( int i = 0 ; i < BlocksPerHeight ; i ++ ) { for ( int j = 0 ; j < BlocksPerWidth ; j ++ ) { // Laske siirtymät VerticalOffset = ( i << 4 ) * OffsetPerLine + StartOffset ; HorizontalOffset = ( j << 4 ); //Aseta nykyisen lohkon siirtymät CurrPtr = CurrentFrame + VerticalOffset + HorizontalOffset ; PrevPtr = EdellinenFrame + VerticalOffset + Horizontal Offset ; MinError = MAXPITKÄ ; //Pidämme virheen erittäin suurena for ( int y = - MaxMotion ; y < MaxMotion ; y ++ ) { TempOffset = y * OffsetPerLine ; //Tallenna kertolaskuissa kohteelle ( int x = - MaxMotion ; x < MaxMotion ; x ++ ) { //GetError - lohkovertailutoiminto, esim. SAD Error = GetError ( CurrPtr , PrevPtr + TempOffset + x , OffsetPerLine ); //Uusi ehdokas :) jos ( Virhe < MinError ) { ProbMV . x = x ; ProbMV . y = y_ _ MinError = Virhe ; } } } //Kirjoita tuloksena oleva vektori :) MotionVectors [ i * BlocksPerWidth + j ] = ProbMV ; } } }

Uudessa[ milloin? ] MPEG -4 AVC/H.264 -standardi esitteli myös ei-neliömäiset (suorakulmaiset) lohkot, joiden koko voidaan jakaa 4×4 pikseliin asti . Siten naapurikehysten samankaltaisuutta voidaan käyttää erittäin tehokkaasti ja lohkojen monimutkaisemman muodon vuoksi liikekompensoinnin tarkkuus liikkuvien kohteiden rajoilla kasvaa. Liikekompensaation lisäksi kuvan tarkennusta varten (tai äskettäin ilmaantuville alueille, jotka eivät olleet edellisissä kehyksissä) käytetään kehysten välistä tiedon pakkausta ja itsenäistä lohkopakkausta.

Pakkauksen lisäksi käytetään aktiivisesti liikekompensaatiota[ kenen toimesta? ] videon suodatuksessa, erityisesti korkealaatuisissa suodatinvaihtoehdoissa: lomituksen poisto (lomitus progressiiviseen ) , kohinanvaimennus , kuvanopeuden muutokset ja muut.

Katso myös

  • globaali liikkeen

Linkit