matplotlib og numpy i bildebehandling

Denne posten er del 2 av 7 i serien Bildebehandling med python i vgs

Vi kan se på et svart-hvitt-bilde som en matrise av tall, hvor verdien viser hvor lys gråtonen er. Verdiene kan for eksempel være desimaltall mellom 0 og 1 eller heltall mellom 0 og 255 (tall som kan skrives med 8 bits).

Matplotlib har noen enkle funksjoner for å lese inn et bilde fra en fil, vise det og å lagre bildet. For å forenkle litt mer, er det noen ferdige funksjoner under.

import matplotlib.pyplot as plt
import numpy as np

def lesBilde(fil):
    '''
    Hjelpefunksjon som laster inn et svart/hvitt-bilde og returnerer 
    en matrise med heltall. De fleste bildeformat kan importeres.
    '''
    bilde = plt.imread(fil)
    
    # Om bildet er i farger, blir det lagret i en [n,m,3]-matrise, 
    # en for hver basisfarge (rød, grønn, blå). Det blir konvertert til 
    # svart-hvitt og fargene justert for hvor følsomme vi er for de.
    if len(bilde.shape) > 2:
        bilde = bilde[:,:,0]*0.2126 + \
                bilde[:,:,1]*0.7152 + \
                bilde[:,:,2]*0.0722
        
    # Om bildet blir lest inn som flyttall, vil vi gjøre det om til heltall
    if np.issubdtype(bilde.dtype, np.floating):
        bilde = bilde * 255
        bilde = np.uint8(bilde)
    return bilde

def skrivBilde(bilde, filnavn):
    '''
    Hjelpefunksjon som lagrer en matrise som et bilde. 
    '''
    plt.imwrite(bilde, filnavn, vmin=0,vmax=255)

def visBilde(bilde):
    '''
    Hjelpefunksjon som viser en matrise som et bilde. 
    '''
    fig = plt.figure(figsize=(6,6)) # Endre gjerne størrelsen her
    plt.imshow(bilde, cmap="gray",vmin=0,vmax=255)
    plt.axis("off")

Bildet under er et klassisk bilde fra en åpen database. Undersøk gjerne noen av dine egne bilder.

b = lesBilde("cameraman.png")
visBilde(b)

Utdrag av matriser

Her tar vi et utsnitt av matrisen/bildet der hvor øret til mannen er. Origo i billedbehandling er satt øverst til venstre, så det blir likt matriseindeksene..

visBilde(b)
plt.axis("on")
plt.show()
øre = b[55:65,105:115]
print(øre)
visBilde(øre)
[[  9   9  10   9  17  16  10  10  10   9]
 [  9   9  10  56 100  88  25  10  10   9]
 [  9   9  77  82  58  26  55  11  10  10]
 [  9  20 152 163 126  22  19  11  10   9]
 [ 10  57 151 180 146  61  62  37  18  12]
 [ 12  45 145 164  72  82 133 166  78  14]
 [ 12  29 138 149  83  64 190 176 127  22]
 [ 18  24 132 141  68  35 148 151 110  17]
 [ 20  19 116 113 173  34 121 133  80  17]
 [ 21  20  39 173 181 134 118 133 101  65]]
Serienavigasjon<< Enkel bildebehandling med python i vgsHistogram fra bilder >>

Underviser i matematikk, fysikk og naturfag på Tryggheim vgs.