noqqe » blog | sammelsurium | photos | projects | about

Abandoned Tuples - Teil 2

2020-01-30 @ Fotos, Pillow, Python

Nachdem wir im ersten Teil ein paar schöne zufällige Bilder generiert haben, geht es nun daran was man mit bestehenden Bildern so machen kann.

Die Basis ist auch dieses mal wieder die Liste mit Tupeln, die ich von Image.getdata() bekomme.

[ (255,255,255), (0,0,0), ... ]

Im Folgenden habe ich mir zwei Helper-Funktionen geschrieben, um ein existierendes Bild einzulesen und eine um ein Bild mit veränderten Werten schreiben zu können.

# Bild auslesen
def get_image(inf):
    x, y = Image.open(inf).size
    pixels = list(Image.open(inf).getdata())
    return x, y, pixels

# Verändertes Bild abspeichern
def new_image(x, y, out, data):
    img = Image.new('RGB', (x, y))
    img.putdata(data)
    img.save(out)

Fotos abdunkeln/aufhellen

Was passiert zum Beispiel wenn ich die Daten eines Bildes einlese, überall 20 Punkte abziehe und das Bild abspeichere? Ich hatte keine Ahnung und dann etwas herumgespielt, was man so verändern könnte:

# alt
[ (255,255,255), (145,77,83), ... ]

# neu
[ (235,235,235), (115,47,63), ... ]

Was passiert ist, dass ich damit die Helligkeit des Fotos verändere!

Ich habe mir also eine kleine Funktion gebaut, welches über alle Tuples iteriert und einen konfigurierbaren Wert abzieht.

def darken(inf, outf, dec):
    x, y, pixels = get_image(inf)

    npixels = []
    for pixel in pixels:
        l = list(pixel)
        l[0] = l[0] - dec
        l[1] = l[1] - dec
        l[2] = l[2] - dec

        npixels.append(tuple(l))

    new_image(x, y, outf, npixels)

darken("cat.png", "dark.png", 20)

Zum Verdeutlichen habe ich mir mal eine kleine süße Katze von unsplash runtergeladen.

Am Ende ist es einfach genau das, was Programme tun wenn man am Helligkeits Slider herumspielt?! Wenn ich die Werte addiere, wird das Bild dementsprechend heller.

Fotos kälter/wärmer aussehen lassen

Einen weiteren gängigen Effekt den man aus der Foto Bearbeitung kennt ist Fotos wärmer bzw kühler zu machen.

RGB besteht ja wie der Name schon sagt aus 3 Farben, Rot, Grün, Blau.

  R  G  B
(145,77,83)

Das heisst, um ein Bild kälter wirken zu lassen (ohne das ein Bärenreitender Putin darauf sein soll) kann ziehe ich bei Rot etwas ab und gebe es bei Blau hinzu. So bekommt ein Bild einen Blaustich und es wirkt kalt.

[ (230, 155, 30), ... ]
   -20,   0, +20
[ (210, 155, 50), ... ]

Um das zu tun nehme ich ehrlich gesagt fast die gleiche Funktion wie bei der Helligkeit zur Hand und ändere sie etwas. Zum Beispiel für Abkühlung

def cooling(inf, outf, dec):
    x, y, pixels = get_image(inf)

    npixels = []
    for pixel in pixels:
        l = list(pixel)
        l[0] = l[0] - dec
        l[2] = l[2] + dec
        npixels.append(tuple(l))

    new_image(x, y, outf, npixels)

cooling("cat2.png", "cooling.png", 20)

Das erste der 3 Bilder wurde eben umgekehrt (rot +20, blau -20) verändert und wirkt daher wärmer… :)

Next up: Kontrast & Flattening