Menu
CoddyTech

画像の色

CoddyのMachine Learningジャーニー「教師なし学習」セクションの一部。レッスン 41/51。

シルクスクリーン印刷で使えるインクは数色で、何百万色もありません。k-meansは、どんな画像にも最適な数色を選びます:

夕日の画像が2枚並んでいる。左は元の画像:紫からオレンジへと色が変化する空、黄色い太陽、オレンジ色の反射が映る暗い海。右は同じ夕日を4色のベタ塗りで表現した画像

カラー画像の形状は (rows, columns, 3) で、各ピクセルは赤、緑、青の値を持ち、それぞれ 0 から 1 の範囲です。reshape を1回使うと、ピクセルがデータになります:

オレンジ、黄色、濃い青のピクセルで構成された2×3の画像と、6行の表への矢印。各行は1つのピクセルに対応し、赤、緑、青の値をそれぞれ保持している

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)

各中心は色です。ラベルを使って中心をインデックス参照すると、各ピクセルにその中心の色が割り当てられます。reshape によって行が元の画像に戻されます。

challenge icon

チャレンジ

中級

ポスター制作スタジオでは、山の湖をk色のインクでシルクスクリーン印刷します。スターターコードは、40×60のimageを描画し、kを読み取り、タイトル付きのグラフを設定します。

  1. 画像をピクセルごとに1行に並べ替え、k-meansでk色を見つけます。
  2. 各ピクセルをその中心色で塗り直し、行を元に戻して画像にします。
  3. axに描画して表示します。

5色のインクで描いた、この夕焼けのように:

5色のベタ色で塗り直した夕焼け。タイトルは「5 inks」:プラム色とローズ色の空の帯、オレンジ色の帯、黄色い太陽、オレンジ色の縞模様が入った紺色の海

プログラムは何も出力しません。Coddyが画像とインクについて説明します。それからkの値を変えて試してみましょう。赤いボートに専用のインクが割り当てられるのはいつでしょうか?

自分で試してみよう

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


# 40×60の山間の湖を描く:空、雪をかぶった山頂、森、湖面、赤いボート
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)


# 以下の行は変更しないでください
image = paint_lake()
k = int(input())
fig, ax = plt.subplots()
ax.set_title(f"{k} inks")
ax.axis("off")

# 以下にコードを書いてください
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

教師なし学習のすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ