IN2070 vår 2021 - UKEOPPGAVER 1

Disse oppgavene omhandler pikselmanipulasjon, romlig oppløsning, sampling, samt kvantisering.

Bildene vi skal jobbe med vil kunne finnes under http://www.uio.no/studier/emner/matnat/ifi/IN2070/v21/undervisningsmateriale/bilder/

Kodeeksemplene under er skrevet i Matlab.  Dere kan selv velge hvilket språk dere ønsker å benytte for å løse oppgavene, men vi foreslår at dere enten benytter Matlab eller python. [Et åpent og fritt (og gratis) alternativ til Matlab er GNU Octave.]

Oppgave 1 - Komme i gang med pikselmanipulasjon i Matlab/Phyton

Dette Matlab-skriptet leser inn et gråtonebilde og viser det på skjermen:

filename = 'lena.png';
f = imread(filename);
colormap(gray(256));  % Vis bilder i gråtoner
imagesc(f, [0 255]);  % La 0 vises som sort, og 255 som hvitt

Følgende kodebit går igjennom hvert piksel i bildet og halverer gråtoneverdiene:

[N M] = size(f);
f_out = zeros(N,M);
for i=1:N
  for j=1:M
   f_out(i,j) = 0.5 * f(i,j);
  end
end

(Se nederst på denne siden for eksempelet over i python.)

Skriv et program som leser inn bildet mona.png, regner ut differansen mellom nabo-piksler, og viser resultatet som et bilde på skjermen. Altså vil resultat-bildet være:

f_out(i,j) = f(i,j) - f(i-1,j)

image()-kommandoen viser negative verdier som sort, så prøv å vise bildet med en bias på feks. 128. (Legg 128 til hver piksel).

Prøv å multiplisere f_out med en faktor større enn 1, hva skjer med kontrasten i resultatbildet da?

Oppgave 2 - Oppløsning og samplingsteoremet

Anta at vi bruker en ("perfekt") linse med aperturediameter D = 10 mm og fokallengde ("brennvidde") f = 50 mm. La avstanden fra linsen til det vi avbilder være s = 5 meter. Benytt bølgelengde (lambda) på 500 nanometer.
(Det kan være en ide å se på side 8 i forelesningsnotatene for 2021.)

  1. Hva er den minste avstanden y, i følge Rayleigh-kriteriet, mellom to punkter som kan adskilles?
  2. Hva er denne avstanden i bildeplanet (y' i forelesningsnotatene)?
  3. Hva er grensene for minste periode og høyeste frekvens i et slikt bilde (T og f i forelesningsnotatene s. 9)?
  4. Hva er minste avstanden man må ha mellom to samplings-elementer i bildeplanet for å kunne gjenskape detalj-nivået fra det digitale bildet? (Anta her at størrelsen på pikselen kun er et punkt).
  5. Hvis størrelsen på CCD-brikken (den hvor de fotosensitive samplings-elementene ligger) er 16 mm x 24 mm og elementene er uniformt fordelt, hvor mange piksel-elementer ville den måtte ha for å nå kravet fra oppg. d?
  6. La oss anta at abberasjoner (feks. sfæriske) og fokuseringsproblemer gir en punktspredningsfunksjonen (PSF) dobbelt så stor/bred som den vi til nå har regnet med. Hva blir svarene på oppg b,c, d og e da?
  7. Om aparturediameteren dobles, ville den romlige oppløsningen bli bedre eller dårligere?

Oppgave 3 - Pikselstørrelse og anti-aliasing

La det vi avbilder bestå av punktspredere jevnt fordelt utover objektplanet, og med en avstand mellom dem ned mot grensen til hva Rayleigh-kriteriet for vårt avbildningssystem krever. Avstanden mellom punktsprederne ved avbildningsflaten for vårt oppsett er 10 mikrometer. Hvis vi har en avstand mellom våre digitale sampler på 50 mikrometer, og en "pikselstørrelse", altså det området vi integrerer/samler opp lyset i fra, lik 50x50 mikrometer, hvordan vil det digitale bildet se ut? Hva om pikselstørrelsen kun var 1x1mikrometer?

Oppgave 4 - Kvantisering og visuell kvalitet

Matlab-skriptet under fremviser et bilde med et gitt antall bit. Eksperimenter med å endre antall bit ved hjelp av bit-variabelen på f.eks. mona.png og lena.png.

bit = 8; % Velg antall bit mellom 1 OG 8

f = imread('lena.png');
colormap(gray(256)); % Vis bilder i gråtoner
f_requantized = floor(double(f)/(2^(8-bit))); % Ny, uniform kvantisering
imagesc(f_requantized, [0 2^bit-1]); % Vis bildet med 0 som sort og 2^bit-1 som hvitt
colorbar; % Vis fargekart 

Hvor langt ned i antall kvantiseringsnivåer kan du gå før den visuelle kvaliteten på bildene forringes betydelig?

Som en tilleggsresurs: Eksperimenter gjerne også med den interaktive pikselkvantiserings-appleten under http://www.imageprocessingbasics.com/image-pixel-quantization/
(se kommentarer under oppgave 9).

Oppgave 5 - Lagringsbehov

Anta et HD (high definition) videokamera som genererer bilder med 1080 linjer som hver består av 1920 sampler. Det tar 50 bilder i sekundet. Hvert piksel i fargebildene har 24 bits oppløsning; 8 bit for hver av fargene rød, grønn og blå. Hvor mange byte trengs da for å lagre en 2-timers video hvis bildene lagres uten kompresjon?

Oppgave 6 - Rekvantisering

Et 8 bits bilde av en scene med ca like mange bakgrunnspiksler som forgrunnspiksler skal rekvantiseres til 1 bit. Hovedvekten av bakgrunnspikslene har verdi omkring 50, mens hovedvekten av forgrunnspikslene har verdi omkring 200. For å minimere kvantiseringsfeilen, hvor ville du valgt kvantiseringsnivået (terskelen) og hvilke verdier for 0 og 1 ville du benyttet for rekonstruksjon til 8 bit?

Oppgave 7 - Antialiasing

Diskuter påstanden: Med tilstrekkelig antall kvantiseringsnivåer kan antialiasing likesågodt utføres etter samplingsprosessen.

Oppgave 8 (Ekstraoppgave) - Dithering

Som dere sikkert la merke til i Oppgave 4, så vil man ved lavt antall gråtoner ofte få tydelige falske konturer i bildet. En måte å begrense denne uønskede effekten på er å legge til litt (hvit) støy før man foretar kvantiseringen. Kodebiten under legger til litt slik (hvit, normalfordelt) støy på bildematrisen. Benytt det støyfylte bildet i kodebiten fra Oppgave 4 og se om dette hjelper mot de falske konturene i bildet.

noiseFactor = 10;
[N M] = size(f);
fNoisy = double(f) + noiseFactor * randn(N,M);

Eksperimenter med forskjellig mengde støy (noiseFactor-variabelen).

Oppgave 9 (Støtteoppgave) - Sampling, aliasing og antialiasing

Eksperimenter med den interaktive samplings-appleten under http://www.imageprocessingbasics.com/image-sampling-and-aliasing/. Appleten resampler gitte bilder ned til færre samplingspunkter. Den indikerer hvor den henter ut de nye samplene (med røde prikker), og viser/tegner så disse nye pikslene som (store) firkanter.

Legg merke til at ved antialiasing skrudd på, vil man glatte ut (gjøre bildet mer diffust), altså fjerne/dempe de høyfrekvente bidragene man ikke kan representere, før sampling.

 

Beklageligvis så har ikke imagprocessingbasics.com fått fullført migrasjonen bort fra den "utdødde" java-applet-platformen.  Det betyr at du trolig ikke får startet appleten i nettleseren din.  For å kjøre appletene må dere benytte programmet appletviewer.  Dette programmet skal være ferdig installert på UiO-maskinene (Linux, i hvert fall).  Om det ikke er det, får man tak i programmet ved å installere Java Development Kit (JDK).  For å starte appleter, start appletviewer fra kommandolinjen med en URL til hvor appleten befinner seg, feks:

>> appletviewer http://www.imageprocessingbasics.com/image-sampling-and-aliasing/

 

Første kodesnutt i Python:

from scipy.misc import imread
import matplotlib.pyplot as plt
import numpy as np

# Første del:
filename = 'lena.png'
f = imread(filename,flatten=True)
plt.imshow(f,cmap='gray')

# Andre del:
N,M = f.shape
f_out = np.zeros((N,M))
for i in range(N):
 for j in range(M):
  f_out[i,j] = 0.5*f[i,j]

plt.figure()
plt.imshow(f_out,cmap='gray',vmin=0,vmax=255,aspect='auto')
plt.title('f_out')

# Alternativ andre del med litt mindre kodelinjer som gjør akkurat det samme:
f_out_alt = 0.5*f

plt.figure()
plt.imshow(f_out_alt,cmap='gray',vmin=0,vmax=255,aspect='auto')
plt.title('f_out_alt')

plt.show()

Publisert 13. jan. 2021 07:55 - Sist endret 16. feb. 2021 10:52