Menu
CoddyTech

Kolory obrazu

Część sekcji Uczenie nienadzorowane ścieżki Machine Learning w Coddy. Lekcja 41 z 51.

Drukarz sitodrukowy ma kilka farb, a nie miliony kolorów. k-means wybiera kilka najlepszych do dowolnego obrazu:

Dwa obrazy zachodu słońca obok siebie. Po lewej oryginał: niebo przechodzące od fioletu do pomarańczowego, żółte słońce, ciemne morze z pomarańczowym odbiciem. Po prawej ten sam zachód słońca w 4 płaskich kolorach

Obraz kolorowy ma kształt (wiersze, kolumny, 3): czerwony, zielony i niebieski dla każdego piksela, każdy w zakresie od 0 do 1. Jedno przekształcenie reshape zamienia piksele w dane:

Obraz o wymiarach 2 na 3 piksele w kolorze pomarańczowym, żółtym i ciemnoniebieskim, ze strzałką wskazującą tabelę z 6 wierszami, po jednym na piksel, z których każdy zawiera wartości czerwonego, zielonego i niebieskiego

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)

Każde centrum to kolor. Indeksowanie centrów za pomocą etykiet przypisuje każdemu pikselowi kolor jego centrum; zmiana kształtu składa wiersze z powrotem w obraz.

challenge icon

Wyzwanie

Średni

Studio plakatowe drukuje sitodrukiem górskie jezioro przy użyciu k farb. Kod początkowy maluje obraz image o wymiarach 40 na 60, odczytuje k i przygotowuje wykres z tytułem.

  1. Przekształć obraz w wiersze, po jednym na piksel, i znajdź k kolorów za pomocą algorytmu k-means.
  2. Pomaluj ponownie każdy piksel kolorem jego środka i złóż wiersze z powrotem w obraz.
  3. Narysuj go na ax i wyświetl.

Na przykład ten zachód słońca w 5 farbach:

Zachód słońca pomalowany ponownie przy użyciu 5 jednolitych kolorów i z tytułem 5 farb: pas śliwkowego i różanego nieba, pomarańczowy pas, żółte słońce, granatowe morze z pomarańczowymi paskami

Twój program niczego nie wypisuje: Coddy opisuje twój obraz i użyte farby. Następnie wypróbuj inne wartości k: kiedy czerwona łódź dostanie własną farbę?

Spróbuj swoich sił

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


# Rysuje górskie jezioro o wymiarach 40 na 60: niebo, ośnieżony szczyt, las, wodę i czerwoną łódkę
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)


# Nie zmieniaj poniższych wierszy
image = paint_lake()
k = int(input())
fig, ax = plt.subplots()
ax.set_title(f"{k} inks")
ax.axis("off")

# Napisz swój kod poniżej
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Uczenie nienadzorowane

Poćwicz samodzielnie: Kompilator Python online