Menu
CoddyTech

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:

Due immagini di un tramonto affiancate. A sinistra, l’originale: un cielo che sfuma dal viola all’arancione, un sole giallo, un mare scuro con un riflesso arancione. A destra, lo stesso tramonto in 4 colori piatti

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:

Un'immagine di 2 per 3 con pixel arancioni, gialli e blu scuro, con una freccia verso una tabella di 6 righe, una per ogni pixel, ciascuna contenente i valori di rosso, verde e blu

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.

challenge icon

Sfida

Medio

Uno 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.

  1. Trasforma l’immagine in una riga per ogni pixel e trova k colori con k-means.
  2. Ridipingi ogni pixel con il colore del suo centro e ricomponi le righe in un’immagine.
  3. Disegnala su ax e visualizzala.

Come questo tramonto in 5 inchiostri:

Il tramonto ridipinto con 5 colori uniformi e intitolato 5 inchiostri: una fascia di cielo color prugna e rosa, una fascia arancione, un sole giallo, un mare blu navy con strisce arancioni

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
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Apprendimento non supervisionato

Esercitati da solo: Compilatore Python online