Disse oppgavene omhandler segmentering ved terskling.

Oppgave 1 - Generell gråtoneklassifikasjon til forgrunn/bakgrunn
Her følger litt Matlab-kode for å få dere i gang. Den laster inn et bilde av en lys tekst på mørk bakgrunn. (Bildet ligger på det vante stedet.)

%% Load a "clean" image
im_clean = imread('textImage_clean.png');
im_clean = double(im_clean);
[N M] = size(im_clean);

%% Add some noise
noiseStd = 30; % How much white noise to add
im_noisy = im_clean + noiseStd * randn(N,M);

%% Add varying light-intesity model
lightFactor = 10; % Increasing this increases effect of our varying-light model
lightMask = repmat( ((1:M)-M/2)/M, N, 1);
im_light = im_clean + lightFactor * lightMask;

%% Separate background and foreground pixels using our "clean" image
backgroundPixels = im_noisy(im_clean<150);
foregroundPixels = im_noisy(im_clean>150);

Og her er samme kode i Python:

# Load a "clean" image
im_clean = imread('textImage_clean.png', as_gray=True)
(N, M) = im_clean.shape

# Add some noise
noiseStd = 30 # How much white noise to add
im_noisy = im_clean + noiseStd * np.random.normal(0, 1, (N,M))

# Add varying light-intesity model
lightFactor = 10 # Increasing this increases effect of our varying-light model
lightMask = np.array([[(x-M/2)/M for x in range(1, M+1)] for y in range(N)])
im_light = im_clean + lightFactor * lightMask

# Separate background and foreground pixels using our "clean" image
backgroundPixels = [im_noisy[x][y] for x in range(N) for y in range(M) if im_clean[x][y] < 150]
foregroundPixels = [im_noisy[x][y] for x in range(N) for y in range(M) if im_clean[x][y] > 150]

  1. Studer histogrammet til im_clean. For å segmentere ut forgrunn (tekst) fra bakgrunnen ved terskling, hvor ville du lagt terskelen?
  2. Prøv å endre på hvor mye støy som legges til bildet, noiseStd-variabelen, og studer effekten dette har på resultathistogrammet. Hvordan spiller dette inn på muligheten for å skille forgrunn fra bakgrunn ved terskling?
  3. Prøv å endre på hvor mye av "lyshets-masken" som blir lagt til. Hvilken effekt har dette på bildets histogram?
  4. Hvor stor kan lightFactor være før man ikke kan (fullstendig) skille forgrunn fra bakgrunn ved en enkel terskling?
  5. Lag et histogram for bakgrunnspikslene og forgrunnspikslene (h1 og h2) hver for seg. Plot de begge i samme figur. Basert på dette, hvor ville du lagt terskelen for å segmentere ut forgrunn fra bakgrunn?
  6. Fra h1 og h2 og en gitt terskel t, hvor mange feilklassifiserte piksler (piksler som skulle vært satt til bakgrunn, men som som blir satt til forgrunn, og omvendt) ville man fått?
  7. Fra h1 og h2, finn de normaliserte histogrammene p1 og p2, samt F og B slik at det (totale) normaliserte histogrammet kan skrives p = B*p1 + F*p2. Se forelesningsnotat s. 10.

Oppgave 2 - Effekten av glatting
Last inn bildet discImage.png. Studer bildets histogram. Utfør middelverdifiltrering med forskjellige filterstørrelser. Studer hva slik filtrering gjør med bildets histogram, og gi en forklaring på hva du ser.

Oppgave 3 - Terskling i praksis
Implementer Otsus metode, Ridler & Calvards metode (k-means, s. 746 i DIP,4Ed.) , og gjør deg kjent med følgende implementasjon av Niblacks adaptive, lokale metode:

function [ret] = getNiblack(im, n, k)

im_localmean = conv2( im, ones(n,n)/n^2, 'same' );
im_localsquared = conv2( im.^2, ones(n,n)/n^2, 'same' );
im_localstd = ( im_localsquared - im_localmean.^2 ).^0.5;

ret = im > (im_localmean + k*im_localstd);

Eksperimenter med forskjellige parametre til Niblack-algoritmen på bildene generert fra koden i Oppgave 1. Prøv forskjellige noiseStd- og lightFactor-verdier. Bland også im_light med im_noisy. Når er det nødvendig å benytte lokale metoder for å få godt resultat?