Kohinat kohil­leen: Syvyys­ku­van jälki­kä­sit­te­lyä FFMpeg-ohjelmalla

Base Camp – Opis­ke­li­jay­rit­tä­jyy­sa­lus­to­jen kehit­tä­mi­nen -hank­keen etätek­no­lo­gia­ko­kei­lua virtu­aa­li­ho­lo­gram­mien parissa on viety eteen­päin inten­sii­vi­val­men­nuk­sen holo­gram­mi­tal­len­teen teke­mi­sellä Intel Real­sense-kame­roita hyödyn­täen (ks. artik­keli tässä julkai­sussa). Seuraa­vaksi vuorossa on tallen­teen siis­ti­mi­nen ja holo­gram­mi­vi­sua­li­soin­nin luomi­nen Micro­soft Holo­len­sille Unity-sovel­lus­ke­hit­ti­mellä, että voimme testata holo­gram­mia käytän­nössä. Tässä artik­ke­lissa keski­ty­tään tallen­teen syvyys­ku­van jälkikäsittelyyn.

Miksi tallen­teen syvyys­ku­van jälki­kä­sit­tely voi olla tarpeen?

Tallen­teen syvyys­tie­toa tallen­net­taessa mittausar­voi­hin on voinut jäädä huojun­taa, joita syntyy elekt­ro­ni­sessa jaksol­li­sen signaa­lin mittauk­sessa. Ne johtu­vat mittauk­sessa käytet­ty­jen senso­rei­den ominai­suuk­sista ja raken­teesta. Niitä voidaan vähen­tää mittaus­da­tan jälki­kä­sit­te­lyn avulla, ja tässä tapauk­sessa jälki­kä­sit­te­lyllä tarkoi­te­taan video­ku­van jälki­kä­sit­te­lyä ja huojun­nalla kuvan kohinaa. Esimer­kiksi kuvassa 1 on nähtä­vissä kohinan vaiku­tus proji­soi­tuun piste­pil­veen – sivusta katsot­tuna kohde ei näytä kovin edustavalta.

Kuva 1. Alku­pe­räi­nen tallenne Unity-sovel­lus­ke­hit­ti­messä 3d-malliksi proji­soi­tuna. Syvyys­tie­dossa havait­ta­vissa paljon kohinaa.

Käytössä olevat kame­ra­tyyppi (D435) itses­sään ei ole paras mahdol­li­nen ehdokas kaukana olevien kohtei­den kuvaa­mi­seen, ja Intelin oman kuvauk­sen mukaan sen kuvassa esiin­tyyy enemmän kohinaa suhteessa muihin. Mutta vastaa­vasti tark­kuus on parempi kuvat­taessa kohteita, jotka voivat olla vain 17 cm päässä kame­rasta. Tämän perus­teella parempi lait­teisto pilo­tissa olevan tallen­nuk­sen toteut­ta­mi­seen olisi Intel Real­sense D415, joilla syvyys­ko­hi­nan määrä on korkei­naan 2% neljään metriin saakka. Lait­teis­tolla on siis rajoit­teita, mutta epätark­kuuk­sien aiheut­ta­mia kuva­vir­heitä voidaan koettaa poistaa suodat­ti­mien avulla.

 Mistä ja millai­set suodattimet?

Tallen­teen jälki­kä­sit­te­lyssä hyödyn­net­tiin FFmpeg-ohjel­mis­toa, jonka avulla on mahdol­lista ohjel­mal­li­sesti muokata video­tal­len­netta. Syvyys­ku­van kohinaa voi muokata niin sano­tuilla tempo­raa­li­suo­dat­ti­milla, jotka seuraa­vat kuva­pis­tei­den arvoja peräk­käis­ten ruutu­jen osalta. Myös muita yksit­täis­ten ruutu­jen kuva­pis­tei­den suodat­ti­mia on mahdol­lista käyttää. Jälki­kä­sit­te­ly­aika riippuu koneen tehosta, tallen­teen pituu­desta, käsi­tel­tä­vän kuva-alueen koosta sekä käyte­tyistä kuvanparannusalgoritmeista.

Keskiar­voon perus­tu­van tempo­raa­li­suo­dat­ti­men toimin­taa havain­nol­lis­te­taan kuvassa 2. Siinä video­ku­van ruudulle kolme laske­taan kuva­pis­teille arvo, perus­tuen nykyi­sen ja kahden edel­tä­vän ruudun kuva­pis­tei­den keskiar­vosta. Kuva­pis­tei­den arvot haetaan aina samoista koor­di­naa­teista jokai­selle ruudulle. Kuvassa 1 ruudun yksi vasem­man yläkul­man kuva­pis­teen arvo on 52, ruudun kaksi vastaava arvo on 128, ja ruudun kolme arvo on 42. Esimerk­ki­suo­da­tin laskee keskiar­von kolmesta ruudusta kulle­kin kuva­pis­teelle oikean­puo­lei­sim­paan tulos­ku­vaan, jolloin lasku­toi­mi­tus (52 + 128 + 42) / 3 tuottaa arvon 74. Muiden kuva­pis­tei­den arvot ovat 0, joten suoda­tin tuottaa niille arvoksi 0.

Kuva 2. Keskiar­voon perus­tu­van tempo­raa­li­suo­dat­ti­men toiminta kolmen video­ruu­dun avulla havainnollistettuna. 

Jälki­kä­sit­te­lyä varten ehdolla olevat suodattimet

FFmpeg-ohjel­misto tukee varsin moni­puo­lista vali­koi­maa erilai­sia suodat­ti­mia video­ku­van käsit­te­lyyn. FFmpeg-ohjel­man doku­men­taa­tio­si­vus­ton kuvaus­ten perus­teella hyödyn­net­tä­väksi kokei­luun vali­koi­tui­vat hqdn3d, deflic­ker, ja avgblur.

Hqdn3d on kuvauk­sen perus­teella korkea­tark­kuuk­si­nen 3d-kohi­nan­pois­to­suo­da­tin. Kolman­nella ulot­tu­vuu­della tarkoi­te­taan aikaa, joka tekee tästä suodat­ti­mesta tempo­raa­li­suo­dat­ti­men. Sen pääasial­li­nen tavoite on tehdä kuvista vakaita, jolloin niiden pakkaa­mi­nen on tehok­kaam­paa. Tässä tapauk­sessa se pyrkii silot­ta­maan harmaa­sä­vy­ar­vo­jen poik­kea­mia peräk­käis­ten ruutu­jen välillä.

deflicker puoles­taan on tempo­raa­li­suo­da­tin kuvan lumi­nans­siar­vo­jen tasoit­ta­mi­seen. Lumi­nans­silla tarkoi­te­taan pinnalta lähte­vän valon kirk­kautta.  Koska kyseessä oleva syvyys­kuva on harmaa­sä­vy­kuva, jossa kirk­kaus tarkoit­taa kauem­paa etäi­syyttä kame­rasta, tällä suodat­ti­mella voidaan tasoit­taa myös eroja syvyydessä.

avgblur puoles­taan on normaali video­ku­va­suo­da­tin, joka hyödyn­tää ainoas­taan käsi­tel­tä­vän video­ku­van ruudun arvoja. Sen toiminta on sumen­taa kuvaa, jonka sinäl­lään ei luulisi paran­ta­van yhtään mitään. Tarkoi­tuk­sena on piilot­taa pieniä epätark­kuuk­sia pinnan muodoissa, jolloin pinto­jen vierek­käis­ten kuva­pis­tei­den arvojen pitäisi olla lähem­pänä toisi­aan, jolloin voimme ainakin teoriassa tasoit­taa pitäisi tasoit­taa kuopat ja ulko­ne­mat virtu­aa­li­ho­lo­gram­min syvyys­kar­tasta. Kuvan tark­kuus toki kärsii, mutta kohinan poiston ollessa pääasial­li­nen tehtävä se voi olla hyödyl­li­nen. Kuvassa 3 nähdään kuiten­kin paran­nusta alku­pe­räi­seen tallen­tee­seen nähden (kuva 2), joten suodat­ti­men on hyvä olla vertai­lussa mukana varsi­nai­siin tempo­raa­li­suo­dat­ti­miin nähden.

Kuva 3. Tallenne Unity-sovel­lus­ke­hit­ti­messä 3d-malliksi proji­soi­tuna, kun se on käsi­telty pelkällä avgblur-suodat­ti­mella . Kohina on vähen­ty­nyt selvästi.

Suodat­ti­mien visu­aa­li­set testit

Suodat­ti­mien vaiku­tusta testa­sin erik­seen, kahden ja kolmen suodat­ti­men kesken erilai­sine permu­taa­tioi­neen. Laatua arvion silmä­mää­räi­sesti kohinan perus­teella samasta kohtauk­sesta Unity-sovel­lus­ke­hit­ti­men avulla. Hqdn3d-suoda­tin ajet­tiin oletus­a­se­tuk­silla. Avgblur-suodat­ti­men arvo­näyt­teis­tyk­sen kooksi määri­tel­tiin 5×5 kuva­pis­tettä. Deflic­ker-suodat­ti­mella analy­soi­tiin 15 peräk­käistä ruutua, ja lasket­tiin kuva­pis­teille arit­meet­ti­nen keskiarvo. Suodat­ti­milla käsi­tel­tiin kahden tunnin tallen­teesta ensim­mäi­nen minuutti, jonka tulosta käytet­tiin vertailussa.

Suodat­ti­mien vaiku­tusta syvyy­sar­vo­vaih­te­lui­den tasoit­ta­mi­seen tutkit­tiin ensim­mäi­sellä kier­rok­sella aina projek­tioi­den kesken, joissa ensim­mäi­sen suoda­tin on kaikille sama. Kier­rok­sella analy­soi­tiin kolmen eri joukon alkioista jatkoon ne, joissa kohina oli vähäi­sintä. Jatkoon pääsi­vät taulu­kon 1 toisessa sarak­keessa X:llä merki­tyt suoda­ti­nyh­dis­tel­mät. Toisella kier­rok­sella oli helpompi tehdä valin­toja syvyys­tie­don muutos­ten ollessa pienem­piä, mutta muutok­set erot­tuessa selvem­min vertai­lu­jou­kon vaih­toeh­to­jen kesken. Näistä tuot­ti­vat silmä­mää­räi­sesti arvioi­den parhaat tulok­set vakau­den kannalta kolme suoda­ti­nyh­dis­tel­mää, eli hqdn3d, avgblur_hqdn3d sekä deflicker_avgblur_hqdn3d.

Kaikki suoda­ti­nyh­dis­tel­mät1. vertai­lun jälkeen2. vertai­lun jälkeen
avgblur  
avgblur_deflicker  
avgblur_deflicker_hqdn3d  
avgblur_hqdn3dXX
avgblur_hqdn3d_deflickerX 
deflic­ker  
deflicker_avgblurX 
deflicker_avgblur_hqdn3dXX
deflicker_hqdn3d  
deflicker_hqdn3d_avgblur  
Hqdn3dXX
hqdn3d_avgblurX 
hqdn3d_avgblur_deflicker  
hqdn3d_deflicker  
hqdn3d_deflicker_avgblur  

Taulukko 1. Suoda­ti­nyh­dis­tel­mät ja vertai­lu­ker­to­jen jatkoon pääs­seet suodattimet.

Näiden kolmen välillä yksi­se­lit­tei­sesti parasta ei käytössä olleen mate­ri­aa­lin avulla voinut valita. Mutta laadun säilyt­tä­mi­sessä on selkeä järjes­tys kolmen vaih­toeh­toina olevan suodat­ti­men kesken –  paras yksit­täi­nen käytet­tävä suoda­tin on hqdn3d. Kahden suodat­ti­men osalta suodat­ti­met ja järjes­tys on avgblur_hqdn3d, ja kolmen osalta puoles­taan deflicker_avgblur_hqdn3d.

Yhteen­ve­tona suodat­ti­mien hyödyn­tä­mi­sestä syvyyskuvaan

Suodat­ti­mien hyödyn­tä­mi­nen on varsin suosi­tel­ta­vaa kohinan pois­ta­mi­seksi syvyys­tie­dosta, ja suodat­ti­mien suori­tus­jär­jes­tyk­sellä on merki­tystä ainakin testeissä käytet­tyyn lähde­ma­te­ri­aa­liin. Suodat­ti­mien avulla saa proji­soi­tua mallia vakaam­maksi, ja siten paran­ne­taan osal­taan loppu­tu­lok­sen laatua, mutta niillä ei kuiten­kaan voi poistaa kohinan vaiku­tusta koko­naan. Mikäli kameraa vaih­ta­malla syvyys­ka­me­ran kohina tallen­nuse­täi­syy­deltä saa pienen­net­tyä jo tallen­nus­vai­heessa, suodat­ti­met voivat toimia paremmin.

Suodat­ti­mien testauk­sessa käytet­tiin varsin suppeata joukkoa säädet­tyjä para­met­reja, joten mahdol­li­suuk­sia syvyys­ku­van laadun paran­ta­mi­seksi on vielä tutki­matta. Testissä käytetty projekti, käytetty mate­ri­aali sekä FFmpeg-ohjel­man suoda­tus­käs­kyt ovat tarvit­taessa saata­vissa artik­ke­lin kirjoittajalta.


Kirjoit­taja:

Anssi Gröhn, tieto­jen­kä­sit­te­lyn lehtori, Basecamp-hanke, Karelia-ammattikorkeakoulu