Cores em imagens
Parte da seção Aprendizado não supervisionado do Journey de Machine Learning da Coddy. Lição 41 de 51.
Uma impressora serigráfica tem algumas tintas, não milhões de cores. O k-means escolhe as melhores para qualquer imagem:
Uma imagem colorida tem o formato (linhas, colunas, 3): vermelho, verde e azul por pixel, cada um de 0 a 1. Uma remodelagem transforma os pixels em dados:
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 é uma cor. Indexar os centros com os rótulos dá a cada pixel a cor do seu centro; o reshape reúne as linhas novamente em uma imagem.
Desafio
MédioUm estúdio de pôsteres imprime em serigrafia um lago de montanha usando k tintas. O código inicial pinta a image de 40 por 60 pixels, lê k e configura um gráfico com título.
- Transforme a imagem em uma linha por pixel e encontre
kcores com k-means. - Repinte cada pixel com a cor do centro correspondente e reorganize as linhas para formar uma imagem.
- Desenhe-a em
axe mostre-a.
Como neste pôr do sol com 5 tintas:
Seu programa não imprime nada: o Coddy descreve sua imagem e suas tintas. Depois, experimente outros valores de k: em que momento o barco vermelho ganha uma tinta própria?
Experimente você mesmo
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# Desenha um lago de montanha de 40 por 60: o céu, um pico nevado, uma floresta, a água e um barco vermelho
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)
# Não altere as linhas abaixo
image = paint_lake()
k = int(input())
fig, ax = plt.subplots()
ax.set_title(f"{k} inks")
ax.axis("off")
# Escreva seu código abaixo
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Aprendizado não supervisionado
1Encontrando Grupos
Aprendendo sem RótulosMedindo a SimilaridadeK-Means à MãoK-Means no scikit-learnRevisão: Frequentadores da Academia4Clustering Hierárquico
Mesclando passo a passoModelos aglomerativosDendrogramasRevisão: raças de cães7PCA na prática
Visualizando 64 dimensõesComponentes como padrõesComprimir e reconstruirPCA antes de um modeloRecapitulação: scanner facial10Projeto: Explorando os Dígitos
Observe os DígitosReduza com PCAAgrupe os DígitosDê Nome aos GruposEncontre os Diferentes2Escolhendo k
InérciaO método do cotoveloPontuações de silhuetaEscale antes de agruparRecapitulando: zonas de entrega3Interpretando agrupamentos
Caracterizando agrupamentosCentros em unidades reaisAgrupamentos versus rótulos conhecidosQuando o K-Means falhaRevisão: degustação de chá9Agrupamentos em ação
Segmentos de clientesAgrupamentos como característicasCores em imagensRevisão: humores de playlistsPratique por conta própria: Compilador de Python online