Løsningsforslag i Python til ukeoppgave om gråtonemapping

Table of contents

Oppgave 2

Oppgave 2

from imageio import imread
import numpy as np
import matplotlib.pyplot as plt

def hist1(img):
    # Anta at bildet img har verdier mellom 0 og 255
    G = 256

    intensities = np.arange(G)
    p = np.array([np.sum(img == i) for i in intensities])/img.size
    return p, intensities

def hist2(img):
    # Denne funksjonen gjør det samme som hist1.
    # Forskjellen er at denne funksjonen gjør ikke vektorisering, og er ment for å vise
    # mer detaljert hva som faktisk skjer i hist1-metoden for å regne ut p.
    G = 256

    intensities = np.arange(G)

    p = np.zeros(G)
    for i in range(G):
        p[i] = np.sum(img == intensities[i])

    p /= img.size

    return p, intensities

if __name__ == '__main__':

    img = imread('mona.png',as_gray=True)

    p1, bins1 = hist1(img)
    p2, bins2 = hist2(img)
    p_np, bins_np = np.histogram(img, bins = 256, range = (0, 256), density = True) # for å sammenligne med numpy

    # Visualiser histogrammene
    plt.subplot(1,3,1)
    plt.title('hist1')
    plt.bar(bins1, p1)

    plt.subplot(1,3,2)
    plt.title('hist2')
    plt.bar(bins2, p2)

    plt.subplot(1,3,3)
    plt.title('np.histogram')
    plt.bar(bins_np[:-1], p_np)

    plt.show()

    # En måte å teste om funksjonene gjør det samme som fra numpy:
    thr = 1e-8
    print('Gjør hist1 det samme som np.histgram?:', np.all(np.abs(p1 - p_np) < thr))
    print('Gjør hist2 det samme som np.histogram?:', np.all(np.abs(p2 - p_np) < thr))
    print('Gjør hist1 det samme som hist2?:', np.all(np.abs(p2 - p1) < thr))

Programmet kan lastes ned her (høyreklikk og trykk "lagre lenke som"/"save link as")

Programmet viser to forslag til hvordan en kan programmere en histogram metode i Python. Metoden hist1 utnytter list comprehension for å gi noen kortere kodelinjer. Det som egentlig skjer i dens utregnelse av variabelen p, er egentlig det samme som loopen i hist2, som også teller antall forekomster av de mulige gråtoneverdiene. Det er opp til deg hva du synes er greiest å jobbe med!

Programmet gjør også en kort sammenligning om det metodene returnerer, faktisk stemmer med numpy sin histogram metode. Å teste sine egne metoder er en fin måte å utelukke bugs som kan komme senere i programmet ditt, og en fin mulighet til å bli kjent med hvilke funksjoner som allerede finnes!

Made with DocOnce