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:
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:
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.
Aufgabe
MittelEin 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.
- Wandle das Bild in eine Zeile pro Pixel um und finde mit k-means
kFarben. - Färbe jeden Pixel mit der Farbe seines Zentrums neu ein und füge die Zeilen wieder zu einem Bild zusammen.
- Zeichne es auf
axund zeige es an.
Wie bei diesem Sonnenuntergang mit 5 Farben:
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
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
1Gruppen finden
Lernen ohne LabelsÄhnlichkeit messenK-Means von HandK-Means mit scikit-learnRückblick: Fitnessstudiomitglieder4Hierarchisches Clustering
Schrittweises ZusammenführenAgglomerative ModelleDendrogrammeZusammenfassung: Hunderassen7PCA in der Praxis
64 Dimensionen sehenKomponenten als MusterKomprimieren und rekonstruierenPCA vor einem ModellRückblick: Gesichtsscanner10Projekt: Ziffern erkunden
Die Ziffern ansehenMit PCA verkleinernDie Ziffern gruppierenDie Gruppen benennenDie Ausreißer finden2k wählen
TrägheitDie Elbow-MethodeSilhouettenwerteVor dem Clustering skalierenRückblick: LieferzonenÜbe selbstständig: Online-Python-Compiler