IN2070 h?st 2023 - L?sningshint 3

Oppgave 1 - Histogrammer


Pikselintensitet langs x-aksen, forekomst langs y-aksen.

a) Bildet vil best? av 8 piksel brede vertikale striper med intensitet ?kende fra 100 ved venstre kant til 163 ved h?yre kant. Som det unormaliserte histogrammet til venstre viser gir dette 8*512 = 4096 piksler av hver av de 64 gr?tonene. Normalisert histogram oppn?s ved ? dele hver s?yle (4096) p? antall piksler i bildet (512*512), som gir 1/64.
b) Histogrammet til h?yre er svar p? en litt forenklet variant: Istedenfor tekst er det lagt p? et m?rkt omr?de som dekker ?vre 1/4 av bildet. 3/4 av pikslene har samme verdi som f?r, mens 1024 piksler fra hver gr?tonestripe har f?tt 25 gr?tonetrinn lavere verdi.

Oppgave 2 - Programmering av histogramfunksjon

import numpy as np
import matplotlib.pyplot as plt

def my_hist(im, G):
    N, M = im.shape
    h = np.zeros([G])

    for i in range(N):
        for j in range(M):
            v = im[i, j]
            h[v] += 1

    return h

# Lag et "dummy-bilde" med tilfeldige tall
im = np.floor(np.random.random([128, 128])*256).astype(int)

# Beregn histogrammet med v?r splitter nye funksjon
h = my_hist(im, 256)

# Plot histogrammet som et stolpediagram
plt.bar(range(256), h) 
plt.xlabel('pikselverdi') 
plt.ylabel('antall') 
plt.show()

Oppgave 3 - Line?r transform

Anta at et bildet har middelverdi lik 100 og varians lik 400, alts? μ = 100 og σ^2 = 400.

  1. Middelverdi ikke langt unna midten av 8-bits intervallet, dvs ca. 127, alts? trolig et rimelig balansert bilde mhp lysheten. Varians p? 400 vil si et standardavvik p? sqrt(400)=20, alts? noe lav kontrast i bildet. (Hadde pikselintensitetene v?rt normalfordelt ville ca. 95% av pikselene v?rt innenfor intervallet [100-2*20,100+2*20]=[60,140].)
  2. Fra forelesningsnotatet s.21. f_min=50, f_max=150, g_min=0, g_max=255. T[i] = 2.55i - 127.5.
  3. Fra notater s.26. a=2, b=10. My_t = a*μ + b = 210. Varians_t = a^2*σ^2 = 4*400 = 1600. (Firedobler variansen, dobler standardavviket).
  4. L?s for a og b i ligningene 128 = a*100 + b og 64^2 = a^2*400. Dette skal gi at a = 64/20, b = 128-a*100.
  5. Se notater s.29. Sigma_t = 2^10 / 4 = 1024/4=256. My_t = 1024/2 = 512. Deretter samme fremgangsm?te som i oppg. d)

Oppgave 4 - Programmering av line?r transform

Legg merke til bevaring av histogrammets "form", samt evt hvor mange av pikslene som man ser blir (eller b?r bli) klippet (til ? forbli innenfor 0-255).

import numpy as np  

def transform_mean_std(img, m_t, sigma_t):
    m_img = np.mean(img)
    sigma_img = np.std(img)

    a = sigma_t/sigma_img
    b = m_t - a*m_img

    return img * a + b
Legg merke til at kodesnutten over konverterer ikke til heltallige pikselverdier, ei heller klipper til verdier mellom 0 og 255.

Oppgave 5 - Ikke-line?re transformer

  1. ..
  2. Logaritmisk. Fremhever kontrasten i lavintensitets-omr?det.
  3. Ved ? putte inn transformen T[i] = i^(1/5) ser vi at vi ender opp med en (skalert) identitets-avbildning.
Publisert 11. sep. 2023 07:43 - Sist endret 11. sep. 2023 07:43