Oppgave 1 - Komme i gang med pikselmanipulasjon i Python
from scipy.misc import imread
import matplotlib.pyplot as plt
import numpy as np
filename = 'mona.png'
f = imread(filename, flatten=True)
# N: antall rader i bildet (matrise), M: antall kolonner i bildet
N, M = f.shape
f_out = np.zeros((N,M))
for i in range(1, N): # La i starte på 1 (og ikke 0)
for j in range(M):
f_out[i,j] = f[i,j] - f[i-1,j]
bias = 128 # brukt bare for fremvising av bildet
plt.figure()
plt.title("f_out + %d" % bias)
plt.imshow(f_out + bias,cmap='gray',vmin=0,vmax=255)
plt.colorbar()
# La imshow automatisk sette minste verdi til sort, og største verdi til hvitt
plt.figure()
plt.title("uten bias, men endret hva som vises som sort og hva som vises som hvitt")
plt.imshow(f_out, cmap='gray')
plt.colorbar()
plt.figure()
plt.title("endring av kontrast")
plt.imshow(f*1.5, cmap='gray',vmin=0,vmax=255)
plt.colorbar()
plt.show()
Oppgave 2 - Oppløsning og samplingsteoremet
- Rayleigh-kriteriet: sin(t) = 1.22*lambda/D gir ca. 6.1*E-5. Siden sin(t) = tan(t) = t for små t, så er y = s*tan(t) = 0.305 mm.
- Fra notat: y' = y*f/(s-f) = 3.08E-06 m, altså ca 3.1mikrometer.
- Den generelle formen vil være som eksempelet s. 5 i forelesningsnotatene. Avstanden på fra sentrum til første sorte ring vil være y' fra forrige oppgave.
- T = y' = ca 3.1 mikrometer. f_0 = 1/T_0 = ca 1/3.1 mikrometer^{-1} (altså ca 1/3.1 per mikrometer).
- Samplingsteoremet sier at man må ha mer enn 2 sampler per periode. Altså må vi ha mer enn 2 sampler per 3.1mikrometer. => Ts < 1.54 mikrometer.
- 16 mm / 1.54 mikrometer er ca. 10400, og 24 mm / 1.54 mikrometer er ca. 15600, så vi må ha 10400x15600 sampler (ca. 162 megasampler).
- Vi ville ha halve oppløsningen, altså 3.1 x 2 = 6.2 mikrometer mellom hvert punkt, mindre enn 3.1mikrometer mellom samplene, og 1/4 av alle samplene i oppgave f.
- Fra Rayleigh-kriteriet ser vi at en økning av D vil gi mindre minste avstand mellom punktspredere som kan skilles. Altså bedre oppløsning.
Oppgave 3 - Pikselstørrelse og anti-aliasing
Hver piksel ville bestått av middelverdien til 5x5 = 25 punkter, så resultatbildet ville blitt flatt (grått). Om samplene var kun 1x1 mikrometer ville bildet fortsatt vært flatt, men intensiteten ville vært avhengig av hvor på bildeflaten pikslene starter. Legg merke til at ved en liten endring i avstanden mellom samplene ville vi sett større, falske strukturer (aliasingeffekter).
Oppgave 5 - Lagringsbehov
Vi multipliserer og får
linjer x sampler per linje x bytes per pixel x bilder per sek x antall sekunder i 2 timer
altså
1080 x 1920 x 3 x 50 x 60x60x2 = 2.239.488.000.000
Dette er rundt 2086 gigabytes, eller rundt 2 terabytes. Kompresjon vil være av vesentlig betydning.
Oppgave 6 - Rekvantisering
Siden like mange forgrunns- som bakgrunnspiksler, ville kvantiseringsterskelen bli lagt midt mellom 50 og 200, (50+200)/2 = 125. Rekonstruksjon hvor 0 ble gjort om til 50 og 1 til 200.
Oppgave 7 - Antialiasing
Hvis man går til den ene ytterkanten og ser fullstendig bort fra kvantiseringsunøyaktigheter, altså at vi har en uendelig presisjon per sample, så er dette egentlig utgangspunktet vårt for vår diskusjon i forelesningen om sampling og aliasing. Altså, kravene til samlingsrate gjelder allerede for dette ekstreme, tenkte tilfellet.
Oppgave 8
from scipy.misc import imread
import matplotlib.pyplot as plt
import numpy as np
f = imread('mona.png', flatten=True)
noisefactor = 10
N,M = f.shape
fNoisy = f + noisefactor*np.random.randn(N,M)
for ii in range(1, 8, 2):
bit = ii
f_requantized = f//2**(8-bit)
plt.figure()
plt.title("#bit = %d" % bit)
plt.imshow(f_requantized, cmap='gray', vmin=0, vmax=(2**bit-1)) # Vis bildet med 0 som sort og 2^bit-1 som hvitt
plt.show()