Menu
CoddyTech

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:

Duas imagens de um pôr do sol lado a lado. À esquerda, a original: um céu que vai do roxo ao laranja, um sol amarelo, um mar escuro com um reflexo laranja. À direita, o mesmo pôr do sol em 4 cores chapadas

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:

Uma imagem de 2 por 3 com pixels laranja, amarelos e azul-escuros, com uma seta apontando para uma tabela de 6 linhas, uma por pixel, cada uma contendo seus valores de vermelho, verde e 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 é 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.

challenge icon

Desafio

Médio

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

  1. Transforme a imagem em uma linha por pixel e encontre k cores com k-means.
  2. Repinte cada pixel com a cor do centro correspondente e reorganize as linhas para formar uma imagem.
  3. Desenhe-a em ax e mostre-a.

Como neste pôr do sol com 5 tintas:

O pôr do sol repintado com 5 cores chapadas e o título 5 tintas: uma faixa de céu ameixa e rosa, uma faixa laranja, um sol amarelo, um mar azul-marinho com listras laranja

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
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de Python online