IN2070 høst 2023 - Løsningshint 1

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

  1. 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.
  2. Fra notat: y' = y*f/(s-f) = 3.08E-06 m, altså ca 3.1mikrometer.
  3. 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.
  4. T = y' = ca 3.1 mikrometer. f_0 = 1/T_0 = ca 1/3.1 mikrometer^{-1} (altså ca 1/3.1 per mikrometer).
  5. 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.
  6. 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).
  7. 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.
  8. 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()

 

Publisert 29. aug. 2023 08:48 - Sist endret 2. sep. 2023 14:51