Colori delle immagini
Fa parte della sezione Apprendimento non supervisionato del percorso Machine Learning di Coddy. Lezione 41 di 51.
Un serigrafo ha pochi inchiostri, non milioni di colori. k-means sceglie i pochi migliori per qualsiasi immagine:
Un'immagine a colori ha forma (righe, colonne, 3): rosso, verde e blu per ogni pixel, ciascuno da 0 a 1. Un reshape trasforma i pixel in dati:
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)Ogni centro è un colore. Indicizzare i centri con le etichette assegna a ogni pixel il colore del suo centro; il reshape riunisce le righe per ricomporre un'immagine.
Sfida
MedioUno studio di poster stampa in serigrafia un lago di montagna con k inchiostri. Il codice iniziale dipinge l’image di 40 per 60 pixel, legge k e prepara un grafico con un titolo.
- Trasforma l’immagine in una riga per ogni pixel e trova
kcolori con k-means. - Ridipingi ogni pixel con il colore del suo centro e ricomponi le righe in un’immagine.
- Disegnala su
axe visualizzala.
Come questo tramonto in 5 inchiostri:
Il tuo programma non stampa nulla: Coddy descrive la tua immagine e i suoi inchiostri. Poi prova altri valori di k: quando ottiene un inchiostro tutto suo la barca rossa?
Provalo tu
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# Disegna un lago di montagna di 40 per 60: il cielo, una cima innevata, un bosco, l'acqua e una barca rossa
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)
# Non modificare le righe qui sotto
image = paint_lake()
k = int(input())
fig, ax = plt.subplots()
ax.set_title(f"{k} inks")
ax.axis("off")
# Scrivi il tuo codice qui sotto
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Apprendimento non supervisionato
1Trovare gruppi
Apprendimento senza etichetteMisurare la similaritàK-Means a manoK-Means in scikit-learnRiepilogo: iscritti alla palestra4Clustering gerarchico
Unire passo dopo passoModelli agglomerativiDendrogrammiRiepilogo: razze canine7PCA nella pratica
Vedere 64 dimensioniComponenti come schemiComprimere e ricostruirePCA prima di un modelloRiepilogo: scanner facciale10Progetto: Esplorare le cifre
Osserva le cifreRiduci con PCARaggruppa le cifreDai un nome ai gruppiTrova gli elementi insoliti2Scelta di k
InerziaIl metodo del gomitoPunteggi silhouetteScala prima del clusteringRiepilogo: zone di consegna3Interpretare i cluster
Caratterizzare i clusterCentri in unità realiCluster ed etichette noteQuando K-Means fallisceRiepilogo: degustazione del tè9Cluster al lavoro
Segmenti di clientelaI cluster come caratteristicheColori delle immaginiRipasso: stati d’animo delle playlistEsercitati da solo: Compilatore Python online