Tööplaan
Meie oleme Jaan Kasak ja Hans Daniel Kaimre, Tartu Ülikooli füüsika eriala esmakursuslased, ning otsustasime fotoonikaklubi raames ehitada holograafilise videoprojektori. Projekti eesmärgiks oli välja töötada ruumilisel optilisel kristallil põhinev videoprojektor, mis kuvaks laservalguse kristallilt peegeldumisel ekraanile liikuvat pilti. Töö põhineb mõneti Ants Remmi, Roland Matti ja Andreas Valdmanni 2014. aastal tehtud tööle, kus sama tehnikat kasutades tekitati rahale turvahologramm. Põhiline erinevus on, et meie pidime suutma kuvada ka liikuvat pilti, mis võimaldaks piisavalt kontrastseid videosi “laserprojektoriga” vaadata.
Põhilised komponendid mida kasutasime olid optilises skeemis kasutatavad He-Ne laser ja läätsed ning kõige olulisem komponent, ruumiline valgusmodulaator(Spatial Light Modulator) HoloEye LC-R 2500. Kõik need komponendid olid juba laboris saadaval, seega lisamaksumusi projektiga ei kaasnenud. Kuna need seadmed olid laboris juba töövalmis, siis projekti põhitöö kujutas endast teooria õppimist ja Pythonis programmeerimist. Projektiga alustasime 2015. aasta sügissemestri alguses, kavatsesime semestri jooksul projekti lõpetada.
1. HoloEye LC-R 2500 ruumiline valgusmodulaator
Teooria ja meetodid
Projekti teooria põhineb Fourier pöördel ja Gerchberg-Saxtoni algoritmil. Fourier ridade teooria kohaselt on võimalik iga 2π perioodiline funktsioon (st. et f(x)=f(x+2π)) lahutada sinusoidide summaks. Kuna pildis leiduvat informatsiooni on võimalik ka vaadelda signaalina, siis on meil võimalik pildi peal rakendada Fourier teisendusi. Diskreetne Fourier teisendus võtab ajast sõltuva signaali ja tagastab sageduste spektri. Selle spektri peal on mõned huvipakkuvad fotograafilised toimetused lihtsamad sooritada kui algse pildi peal. Teisenduse teeb eriti kasulikuks omadus, et ta on ka pööratav. Ehk peale muutuste rakendamist on meil võimalik algne pilt koos muudatustega taastada.
Gerchberg-Saxtoni algoritm rakendab iteratiivselt Fourier teisendust ja Fourier pöördteisendust. Iga iteratsioon algab pöördteisendusega ja lõpeb teisendusega. Kahe teisenduse vahepeal on meile saadaval nii pildi faasihologramm kui ka moodul(intensiivus). Peale algsele pildile Fourier pöördteisenduse rakendamist säilitame selle pildi faasi, kuid sättime mooduli kõikides pildi punktides maksimuheleduse peale. See mõjutab mõnevõrra ka faaspilti, kuid algse pildi sisu säilib. Seejärel rakendame Fourier teisendust, ning muudame jälle pildi moodulit, seekord algse sisendpildi järgi. See tsükkel kordub seni, kuni faashologrammi Fourier teisendus on soovitud teravusega.
2. G-S algoritmi illustratsioon. Allikas: Andreas Valdmann
Selle iteratiivse algoritmi käigus valmib ainult ühe pildi hologramm. Video koosneb aga paljudest kaadritest, iga sekund videot on kokku pandud ca. 25 kaadrist. Video hologrammiks teisendamiseks on vaja igast kaadrist eraldi hologramm teha ning saadud pildid tagasi videoks kokku panna.
HoloEye LC-R 2500 kujutab endast ruumilist optilist kristalli, mille optilist teepikkust saab elektriliselt muuta. “LC” mudeli nimes viitab vedelkristallile, mis katab peegli pinda. Moduleerides vedelkristalli murdumisnäitajat pinna eri punktides eri viisidel, peegeldub kristallilt tagasi faasinihkes valgus, mille peal Fourier pööret rakendades on võimalik ekraanile hologramm kuvada. Kristall saab oma sisendi kuvarilt, mille pealt on võimalik näha difraktsioonipiltidest kokku pandud videot, mis valmis G-S algoritmi kasutades.
3. Optilise kristalli sisend, hologramm kuvaril
Kuvaril leiduv pilt ja valgusmodulaatori vedelkristall on sama resolutsiooniga, st. et nii pildil kui kristallil on ühepalju piksleid. Kristalli saadetakse iga pildi piksli väärtus, mille järgi vedelkristall muudab pildile vastava piksli optilist teepikkust. Näiliselt võib seda vaadelda kui kristalli kõrguse muutmist, kus pinnalt peegeldunud valgus on faasinihkes kuna pinnale langev valgus tabas pinda eri kõrgustel.
Projekti skeem on kujutatud järgneval pildil:
Töö käik
Projekti alguses oli meile saadaval ka eelmainitud turvahologrammides kasutatud G-S algoritmi kood. Kuigi suutsime selle koodi abil proovida holograafiliste videode loomist, osutus koodi sisu meie jaoks liiga keeruliseks ning meie ei osanud seda oma vajaduste järgi muuta, sestap pidasime tarvilikuks kõike ise uuesti teha. Olime seni vaid Pythonis programmeerimist õppinud ning seega otsustasime projekti selles keeles kirjutada.
Sisuliselt oli meil vaja leida sobivas resolutsioonis algne videofail (või siis teisendada videofail sobivasse formaati) ning teisendada see hologrammidest koosnevaks videoks. Selleks pidime kirjutama koodi, mis suudaks videofailist iga kaadri eraldi kätte saada, nendel G-S algoritmi rakendada ning saadud hologrammid lisada uude videofaili. Videotöötluseks kavatsesime kasutada Pythoni teeki OpenCV, mis kujutab endast väga võimekat teeki, millest meie kasutasime ainult paari selle teegi võimalust.
Kuna ettekujutus programmi videotöötluse osast oli juba olemas, otsustasime kõigepealt keskenduda hologrammide tegemiseks vajamineva G-S algoritmi Pythonis kirjutamisele. Meile olid saadaval Wikipeedia materjalid ja Andreas Valdmanni saadetud esitlus, mille järgi üritasime ise töötava programmi valmis saada. Fourier teisenduste ja pöördteisenduste jaoks olid Pythoni numpy teegis olemas meile sobivad funktsioonid. Kuigi algsed tulemused olid võrreldavad algsega, oli meil probleem pildi ülemise poole peegeldumisega alumisel poolel. Juhendajatega konsulteerimisel sai see probleem lahendatud ning meie olime valmis kirjutama programmi videotöötluse osa.
Kuigi videotöötlust hõlmav kood oli lihtne kirjutada, ilmnesid probleemid koodi jooksutamisel. Nimelt esines probleeme sobivate videoformaatide ja codec-ite leidmisega. Suureks veaks arendusprotsessi jooksul osutus ka selle koodi esmane katsetus, kus proovisime töödelda pooleteistminuti pikkust videofaili. Kuna iga kaadri hologrammiks töötlemine võttis aega umbes 2 sekundit, ning igas video sekundis oli 25 kaadrit, pidime ootama kauem kui tund, et avastada vigane väljund.
Peale internetis otsimist leidsime sobiva formaadi ja codec-i, mis tagastas korrektseid väljundeid. Sobivaks codec’iks osutus FMP4. Selleks hetkel oli meil olemas programm, mis võtab sisendiks 1024×768 resolutsiooniga videofaili ja tagastab holograafilise video ning me suutsime optilise kristalli peegeldusest ekraanile näha ka seda videot. Sellega võib projekti põhilised eesmärgid lugeda täidetuks.
4. Laservalgus peegeldub optilise kristalli pinnal kuvatud hologrammilt, peegeldunud valgusel rakendatakse läätse abil optiline Fourier pööre, tulemus kuvatakse ekraanil.
Pildilt on võimalik näha difraktsioonimaksimumi pildi keskel. Kuna see võib häirida pildi vaatamist, siis võib ka maksimumi asukohta nihutada, muutes G-S algoritmi. Juhendajate abiga suutsime tekitada olukorra, kus difraktsioonimaksimum jääb pildi paremasse alumisse nurka, kuhu oli valgele ekraanile paigutatud ka must täpp, soodustamaks pildi vaatamist.
Kokkuvõte
Projekt valmis ootuspäraselt ja õigeaegselt 2015. aasta sügissemestri jooksul. Suutsime kirjutada programmi, mis väljastaks hologrammidest moodustatud video ja seda ruumilise valgusmodulaatori abil vaadata. Siiski on projektis veel kohti, mida võiks edasi arendada.
Projekti põhiosa, meie videotöötluse programmi, võiks mitmel viisil oluliselt efektiivsemaks teha. Kõige fundamentaalsem muudatus oleks üleminek Pythoni programmeerimiskeelelt C++ peale. Kuna Python ei ole nii range keel, peab programmi jooksutamise käigus interpreteerija välja mõtlema, mida iga käsk tähendab, mis teeb programmi aeglasemaks.
Programmi väljundit peaks ka muutma. Praegu võib sisendfail olla suurusjärgus paarkümmend MB, aga väljundfail paarsada MB. Selle parandamiseks peaks väljundfaili tihendama.
Peaks olema võimalik ka G-S algoritmi kiiremaks muutma. Praegu määrab kasutaja ise iteratsioonide arvu, mitu korda algoritmi rakendada enne kui hologramm väljastatakse. Difraktsiooni efektiivsuse sõltuvust iteratsioonide arvust võib lähendada horisontaale asümptoodiga piiratud negatiivse astendajaga eksponentfunktsiooniga. See tähendab, et algsed iteratsioonid on suurema mõjuga, kui hilisemad. Viie iteratsiooniga tehtud hologramm ei ole kuigi palju hägusem kui kümne iteratsiooniga tehtud hologramm, ideaalne iteratsioonide arv võiks olla umbes 4-5. See sõltub ka kasutavatest Fourier teisendustest (fft, fftw).
Hi! Do you know if they make any plugins to safeguard
against hackers? I’m kinda paranoid about losing everything
I’ve worked hard on. Any tips?