(2) Bildegenerering

N? skal vi se videre p? hvordan bildegenereringen foreg?r og generere en rekke med bilder slik som du kan se i figur 1 under.

Figur 1. Her kan vi se et eksempel p? et bilde som kan genereres med metodene vi skal introdusere.

Generering av bilder

N? som vi vet litt mer om hvordan man genererer bilder, kan vi fors?ke ? generere et fra dataene som satellitten sendte oss. Dette bildet vil da bare dekke en del av himmelsf?ren. Dette gj?r vi i fire steg:

  1. For ? gj?re det m? vi begynne med ? finne ut hvor mange piksler det er i bildet. Dette kan gj?res direkte ved hjelp av python-biblioteket PIL.
  2. N?r dette er gjort ?nsker vi ? finne ut spennet av X- og Y-koordinater i bildet. Dette kan vi finne ut med ligningene som vi akkurat utledet. I tilfellet her velger vi et kamera med FOV p? \(70^\circ\) i begge retninger. F?r vi gj?r noen videre utregninger m? dette konverteres til radianer. Dette kan man som du sikkert vet gj?re ved ? dele p? \(360\) og gange med \(2\pi\).
  3. N? ?nsker vi ? lage et rutenett som spenner ut hele bildet i X- og Y-retning. Vi ?nsker ? lage en stereografisk projeksjon fra sf?ren slik at vi finner det korresponderende rutenettet med \(\theta\) og \(\phi\).
  4. Til slutt skal vi bruke dette til ? generere et fullt RGB-bilde sentrert rundt \(\phi=0^\circ\) og \(\theta=90^\circ\). Dette skal s? sammenlignes med et bilde vi har f?tt som er tatt med et vanlig kamera for ? se at det stemmer.

La oss se litt n?rmere p? punkt 3 for ? se hvordan dette kan gj?res. Her skal vi bruke enda en form for koordinater. Denne gangen bruker vi polarkoordinater. Dette er egentlig mye av det samme som kulekoordinater, men her ser vi kun p? to dimensjoner. Dermed er det ganske fornuftig at koordinatene er avstanden \(\rho\) fra et punkt, og vinkelen \(\beta\) som posisjonsvektoren er rotert med i planet. Dette brukes senere n?r vi transformerer koordinatene. Formlene for avstanden fra sentrum i bildet til punktet \((X,Y)\), og vinkelen fra sentrum i kulen til punket er henholdsvis gitt ved:

  1. \(\rho=\sqrt{X^2+Y^2}\)
  2. \(\beta=2\arctan(\rho/2)\)

I figur 2 kan du se hva vinkelen \(\beta\) representerer.

Figur 2. Vinkelen \(\beta\) i stereografisk projeksjon.

Den f?rste ligningen er ganske enkel ? vise fra Pytagoras-setningen, men den andre er kanskje litt mindre intuitiv. Vi skal ikke g? for mye i dybden p? det her, men man kan vise det ved ? se tilbake p? enhetskulen.

La oss begynne med genereringen. F?rst m? vi begynne med ? konvertere vinklene. Dette er n?dvendig fordi vi kan ha ulike utgangspunkter der vi ser p? himmelen fra. Vi begynner med ? transformere vinklene for ? ta hensyn til referansevinkelen \(\theta_0\) og \(\phi_0\). Da kan vi konvertere ved f?lgende uttrykk:

  1. \(\theta=\theta_0-\arcsin\left[\cos(\beta)\cos(\theta_0)+{Y\over{\rho}}\sin(\beta)\sin(\theta_0)\right]\)
  2. \(\phi=\phi_0+\arcsin\left[{X\sin(\beta)\over{\rho\sin(\theta_0)\cos(\beta)-Y\cos(\theta_0)\sin(\beta)}}\right]\)

N? har vi allerede g?tt en del i dybden p? matematikken bak en del av dette, s? vi skal ikke g?r for mye i detalj for hvordan akkurat disse utledes. Men som vi ser gir uttrykkene oss den tilh?rende verdien for vinklene basert p? punktet i planet i tillegg til referansevinklene. 

Da gjenst?r det bare ? bruke disse formlene til ? lage et bilde. Her har vi valgt ? lage en funksjon som tar inn initialvinklene og vil g? igjennom hele matrisen med verdier for \(X\)- og \(Y\)-verdier. I denne sammenhengen betyr en matrise bare en stor tabell over alle \(X\)-koordinater sammen med de tilh?rende \(Y\)-koordinatene. Dermed vil den finne verdien for alle vinklene basert p? de tilh?rende kartesiske koordinatene i planet. 

Videre er vi interessert i ? finne indeksen til hver enkelt koordinat som m? brukes for ? lage bildet. Dette gj?res ved ? g? over alle koordinatene vi har funnet over og pare de opp med de tilh?rende koordinatene. F?r vi gj?r det m? vi likevel endre formatet for koordinatene. B?de \(\theta\) og \(\phi\) vil v?re lagret i form av matriser, men vi ?nsker ? ha de i form av vektorer. Dette kan gj?res direkte ved hjelp av innebygde funksjoner. Videre har vi en funksjon som kan hente ut indeksen til hver enkelt piksel ved ? g? over hvert par med \(\theta\)- og \(\phi\)-verdier. Til slutt vil vi f? en vektor med alle indeksene. 

Da gjenst?r det bare ? generere bilder. N? ?nsker vi ? 360 bilder, en for hver grad. Vi bruker her initialbetingelsen \(\theta_0=90^\circ\) og lar \(\phi\) g? fra \(0^\circ\) til \(359^\circ\). Det vil si at vi ser rett opp fra planet som solsystemet ligger i, og snur oss rundt en runde. For hver grad vi roterer vil vi beregne transformasjons-indeksene. Basert p? transformasjons-indeksene henter vi ut data fra filen for himmelkulen og tilpasser disse for ? passe st?rrelsen til bildet og inverterer det vertikalt. Til slutt blir dataen konvertert til et bilde. I figur 3 kan du se hvor vi ser p? himmelsf?ren ved de ulike vinklene.

Figur 3. Her kan du se hvilken vei vi ser p? himmelkulen. Siden \(\theta=90^\circ\) vil synslinjen v?r ligge langs xy-planet. Vi vil ha \(360\) slike piler som peker i retningen vi ser.

Da vil det dannes slike bilder som i figur 3. Her ser vi samme bilde som i figur 1. Det f?rste bildet hadde vi allerede fra f?r av og bildet i figur 3 er et generert med samme initialbetingelser. Hvis vi sammenligner vil vi se at de er s?pass like at man ikke klarer ? se forskjell med det blotte ?ye.

Figur 4. Generert bilde av en del himmelsf?ren. Her med \(\phi=0^\circ\) og \(\theta=90^\circ\).

Da har vi blitt ferdig med genereringen av bildene, og det gjenst?r bare ? analysere de. Det skal vi gj?re i neste blogginnlegg.

Av Simon Berg, Marius Torsheim
Publisert 17. okt. 2023 20:23 - Sist endret 17. okt. 2023 20:29