Menu
CoddyTech

Couleurs des images

Fait partie de la section Apprentissage non supervisé du Journey Machine Learning de Coddy. Leçon 41 sur 51.

Un sérigraphe dispose de quelques encres, pas de millions de couleurs. k-means choisit les quelques couleurs les mieux adaptées à n’importe quelle image :

Deux images d’un coucher de soleil côte à côte. À gauche, l’original : un ciel passant du violet à l’orange, un soleil jaune, une mer sombre avec un reflet orange. À droite, le même coucher de soleil en 4 couleurs unies

Une image couleur a la forme (lignes, colonnes, 3) : rouge, vert et bleu pour chaque pixel, chacun allant de 0 à 1. Un reshape transforme les pixels en données :

Une image de 2 sur 3 pixels orange, jaunes et bleu foncé, avec une flèche pointant vers un tableau de 6 lignes, une par pixel, contenant chacune ses valeurs rouge, vert et bleu

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)

Chaque centre correspond à une couleur. L’indexation des centres à l’aide des étiquettes donne à chaque pixel la couleur de son centre ; la remise en forme réassemble les lignes pour reformer une image.

challenge icon

Défi

Moyen

Un atelier d’affiches imprime en sérigraphie un lac de montagne avec k encres. Le code de départ peint l’image de 40 sur 60, lit k et prépare un graphique avec un titre.

  1. Transforme l’image en une ligne par pixel et trouve k couleurs avec k-means.
  2. Repeins chaque pixel avec la couleur de son centre et rassemble les lignes pour reformer une image.
  3. Affiche-la sur ax, puis montre-la.

Comme ce coucher de soleil en 5 encres :

Le coucher de soleil repeint avec 5 couleurs unies et intitulé 5 encres : une bande de ciel prune et rose, une bande orange, un soleil jaune, une mer bleu marine avec des rayures orange

Ton programme n’affiche rien : Coddy décrit ton image et ses encres. Essaie ensuite d’autres valeurs de k : à partir de quand le bateau rouge obtient-il sa propre encre ?

Essayez vous-même

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


# Peint un lac de montagne de 40 sur 60 : un ciel, un sommet enneigé, une forêt, de l’eau et un bateau rouge
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)


# Ne modifiez pas les lignes ci-dessous
image = paint_lake()
k = int(input())
fig, ax = plt.subplots()
ax.set_title(f"{k} inks")
ax.axis("off")

# Écrivez votre code ci-dessous
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Apprentissage non supervisé

Entraînez-vous par vous-même : Compilateur Python en ligne