Menu
CoddyTech

Bildfarben

Teil des Abschnitts Unüberwachtes Lernen der Machine Learning-Journey von Coddy. Lektion 41 von 51.

Ein Siebdrucker hat einige wenige Farben, nicht Millionen von Farben. k-means wählt für jedes Bild die besten wenigen aus:

Zwei Bilder eines Sonnenuntergangs nebeneinander. Links das Original: ein Himmel, der von Lila zu Orange übergeht, eine gelbe Sonne, ein dunkles Meer mit einer orangefarbenen Spiegelung. Rechts derselbe Sonnenuntergang in 4 flachen Farben

Ein Farbbild hat die Form (Zeilen, Spalten, 3): Rot, Grün und Blau pro Pixel, jeweils von 0 bis 1. Mit einer Umformung werden die Pixel in Daten umgewandelt:

Ein 2-mal-3-Bild aus orangefarbenen, gelben und dunkelblauen Pixeln mit einem Pfeil zu einer Tabelle mit 6 Zeilen, eine pro Pixel, die jeweils dessen Rot-, Grün- und Blauwerte enthalten

pixels = image.reshape(-1, 3)
km = KMeans(n_clusters=4, n_init=10, random_state=0).fit(pixels)
poster = km.cluster_centers_[km.labels_].reshape(image.shape)
ax.imshow(poster)

Jedes Zentrum ist eine Farbe. Durch Indizieren der Zentren mit den Labels erhält jedes Pixel die Farbe seines Zentrums; das Umformen fügt die Zeilen wieder zu einem Bild zusammen.

challenge icon

Aufgabe

Mittel

Ein Posterstudio druckt einen Bergsee mit k Farben im Siebdruck. Das Starterprogramm zeichnet das 40 mal 60 Pixel große image, liest k ein und richtet ein Diagramm mit Titel ein.

  1. Wandle das Bild in eine Zeile pro Pixel um und finde mit k-means k Farben.
  2. Färbe jeden Pixel mit der Farbe seines Zentrums neu ein und füge die Zeilen wieder zu einem Bild zusammen.
  3. Zeichne es auf ax und zeige es an.

Wie bei diesem Sonnenuntergang mit 5 Farben:

Der Sonnenuntergang, neu eingefärbt mit 5 Flachfarben und dem Titel 5 Farben: ein pflaumen- und rosafarbener Himmelsstreifen, ein orangefarbener Streifen, eine gelbe Sonne, ein marineblaues Meer mit orangefarbenen Streifen

Dein Programm gibt nichts aus: Coddy beschreibt dein Bild und seine Farben. Probiere dann andere Werte für k aus: Bei welchem Wert bekommt das rote Boot eine eigene Farbe?

Probier es selbst

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans


# Malt einen 40 mal 60 Pixel großen Bergsee: einen Himmel, einen schneebedeckten Gipfel, einen Wald, das Wasser und ein rotes Boot
def paint_lake():
    image = np.zeros((40, 60, 3))
    for r in range(40):
        for c in range(60):
            if 30 <= r <= 31 and 10 <= c <= 17 - (r - 30) * 2:
                image[r, c] = [0.8, 0.15, 0.1]
            elif r >= 27:
                t = (r - 27) / 12
                image[r, c] = [0.1, 0.45 - 0.2 * t, 0.65 - 0.2 * t]
            elif r >= 21:
                image[r, c] = [0.1, 0.35 + 0.05 * (c % 3), 0.15]
            elif r >= abs(c - 34) + 4 and r < 10:
                image[r, c] = [0.95, 0.95, 0.97]
            elif r >= abs(c - 34) + 4:
                image[r, c] = [0.45, 0.42, 0.45]
            else:
                image[r, c] = [0.55 + r / 50, 0.75 + r / 120, 0.95]
    return np.round(image, 3)


# Ändere die folgenden Zeilen nicht
image = paint_lake()
k = int(input())
fig, ax = plt.subplots()
ax.set_title(f"{k} inks")
ax.axis("off")

# Schreibe deinen Code darunter
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Unüberwachtes Lernen

Übe selbstständig: Online-Python-Compiler