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:
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:
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.
Desafío
IntermedioUn 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.
- Convierte la imagen en una fila por píxel y encuentra
kcolores con k-means. - Vuelve a pintar cada píxel con el color de su centro y pliega las filas para reconstruir la imagen.
- Dibújala en
axy muéstrala.
Como este atardecer en 5 tintas:
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
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Aprendizaje no supervisado
1Encontrar grupos
Aprender sin etiquetasMedir la similitudK-Means a manoK-Means en scikit-learnRepaso: miembros del gimnasio7PCA en la práctica
Visualizar 64 dimensionesComponentes como patronesComprimir y reconstruirPCA antes de un modeloRepaso: escáner facial10Proyecto: Explorador de dígitos
Observa los dígitosReduce con PCAAgrupa los dígitosPon nombre a los gruposEncuentra los diferentes2Elegir k
InerciaEl método del codoPuntuaciones de siluetaEscalar antes de agruparRepaso: zonas de entrega3Interpretación de los clústeres
Perfilado de clústeresCentros en unidades realesClústeres frente a etiquetas conocidasCuándo falla K-MeansRepaso: cata de té9Clústeres en acción
Segmentos de clientesClústeres como característicasColores de imágenesRepaso: estados de ánimo de listas de reproducciónPractica por tu cuenta: Compilador de Python online