Kantgjenkjenning i bilder med deriverte

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

Algoritmer som skal kjenne igjen objekter i bilder, må ofte først finne hva som er grensene for ulike objekter i et bilde. En måte kan være å se etter endringer i farge. Om en ser på en og en rad vannrett eller loddrett, vil en stor endring i farge tilsvare en stor derivert langs den vektoren.

For treningens del er det greit å lage en egen derivert-funksjon. Om det er viktige data, bør en heller bruke np.gradient()

def derivert(l):
    l = l.astype(float)  # Vi skal dele tallene, det fungerer best med float.
    d = np.zeros(l.shape)
    d[0] = l[1]-l[0]
    d[-1] = l[-1]-l[-2]
    for i in range(1,len(l)-1):
        d[i] = (l[i+1]-l[i-1])/2
    return d

Her deriverer vi hver rad for seg, for å vise kantene som går loddrett.

dx = np.zeros(b.shape)
sx = b.shape[0]
for i in range(sx):
    dx[i,:] = np.abs(derivert(b[i,:]))
visBilde(dx)
        

Om en deriverer både radene og kolonnene, og legger sammen resultatene, får en kantene både vannrett og loddrett.

def finnKanter(bilde):
    sx, sy = bilde.shape
    dx = np.zeros(bilde.shape)
    dy = dx
    for i in range(sx):
        dx[i,:] = derivert(bilde[i,:])
    for i in range(sy):
        dy[:,i] = derivert(bilde[:,i])
    kanter = np.absolute(dx) + np.absolute(dy)
    return kanter.astype(np.uint8)

k = finnKanter(b)
visBilde(k)

Herfra kan ulike strategier forsøke å dele opp bildet i ulike deler for å kjenne igjen ulike deler. Eller objekter kan kjennes igjen ut fra egenskapene til kantene.

Oppgaveforslag

  • De to bildene som viser «deriverte» har ulik intensitet fordi verdiene legges sammen. Bruk histogramutjevning på begge for å forsterke forskjellene og gjøre kantene mer tydelige.
  • Hvordan kan du sikre at verdiene for de «deriverte» ikke overstiger 255?

Serienavigasjon<< Histogram fra bilderMatrisefiltre i bildebehandling >>

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