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?