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