IN2070 høst 2023 - UKEOPPGAVER 7

Disse oppgavene omhandler segmentering ved terskling.

Oppgave 1 - Generell gråtoneklassifikasjon til forgrunn/bakgrunn

Her følger litt Pyton-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.)

from scipy.misc import imread

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

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

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

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

# Histograms of background and foreground pixels
h_b, _ = np.histogram(background_pixels, G, range=[0, G])
h_f, _ = np.histogram(foreground_pixels, G, range=[0, G])

 

  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, noise_std-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 light_factor 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:

import numpy as np
from scipy.signal import convolve2d

def get_niblack(im, n, k):
    im = im.astype(float)
    im_localmean = convolve2d(im, np.ones((n, n)) / (n**2), mode='same')
    im_localsquared = convolve2d(np.square(im), np.ones((n, n)) / (n**2), mode='same')
    im_localstd = np.sqrt(im_localsquared - np.square(im_localmean))
    
    ret = im > (im_localmean + k * im_localstd)
    return ret
Publisert 8. okt. 2023 21:24 - Sist endret 8. okt. 2023 21:24