Menu
CoddyTech

Colores de imágenes

Parte de la sección Aprendizaje no supervisado del Journey de Machine Learning de Coddy. Lección 41 de 51.

Un serigrafista tiene unas pocas tintas, no millones de colores. k-means elige las mejores para cualquier imagen:

Dos imágenes de una puesta de sol, una al lado de la otra. A la izquierda, la original: un cielo que pasa del morado al naranja, un sol amarillo, un mar oscuro con un reflejo naranja. A la derecha, la misma puesta de sol en 4 colores planos

Una imagen en color tiene la forma (filas, columnas, 3): rojo, verde y azul por píxel, cada uno entre 0 y 1. Una operación reshape convierte los píxeles en datos:

Una imagen de 2 por 3 con píxeles naranjas, amarillos y azul oscuro, con una flecha hacia una tabla de 6 filas, una por píxel, cada una con sus valores de rojo, verde y azul

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)

Cada centro es un color. Al indexar los centros con las etiquetas, cada píxel obtiene el color de su centro; el cambio de forma vuelve a plegar las filas para formar una imagen.

challenge icon

Desafío

Intermedio

Un estudio de carteles imprime en serigrafía un lago de montaña con k tintas. El código inicial pinta la image de 40 por 60, lee k y configura un gráfico con título.

  1. Convierte la imagen en una fila por píxel y encuentra k colores con k-means.
  2. Vuelve a pintar cada píxel con el color de su centro y pliega las filas para reconstruir la imagen.
  3. Dibújala en ax y muéstrala.

Como este atardecer en 5 tintas:

El atardecer repintado con 5 colores planos y titulado 5 inks: una franja de cielo color ciruela y rosa, una franja naranja, un sol amarillo, un mar azul marino con franjas naranjas

Tu programa no imprime nada: Coddy describe tu imagen y sus tintas. Después prueba otros valores de k: ¿cuándo consigue el barco rojo su propia tinta?

Pruébalo tú mismo

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


# Dibuja un lago de montaña de 40 por 60: un cielo, un pico nevado, un bosque, el agua y un bote rojo
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)


# No cambies las líneas de abajo
image = paint_lake()
k = int(input())
fig, ax = plt.subplots()
ax.set_title(f"{k} inks")
ax.axis("off")

# Escribe tu código a continuación
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Aprendizaje no supervisado

Practica por tu cuenta: Compilador de Python online