Menu
CoddyTech

이미지 색상

Coddy Machine Learning 여정의 비지도 학습 섹션에 포함된 레슨. 51개 중 41번째.

실크스크린 인쇄에는 잉크가 몇 가지밖에 없고, 수백만 가지 색은 없습니다. k-means는 어떤 그림이든 가장 잘 어울리는 몇 가지 색을 고릅니다:

나란히 놓인 석양 사진 두 장. 왼쪽은 원본으로, 보라색에서 주황색으로 물드는 하늘, 노란 태양, 주황색 반사광이 비치는 어두운 바다가 보입니다. 오른쪽은 같은 석양을 4가지 단색으로 표현한 그림입니다.

컬러 이미지는 (행, 열, 3)의 형태를 가지며, 픽셀마다 빨강, 초록, 파랑 값이 있고 각 값의 범위는 0부터 1까지입니다. 한 번의 reshape로 픽셀을 데이터로 변환합니다:

주황색, 노란색, 짙은 파란색 픽셀로 이루어진 2×3 이미지에서 각 픽셀당 하나씩 6개의 행이 있는 표로 화살표가 이어지며, 각 행에는 빨강, 초록, 파랑 값이 담겨 있음

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. 이미지를 픽셀당 한 행으로 바꾸고 k-means로 k개의 색을 찾습니다.
  2. 각 픽셀을 해당 중심의 색으로 다시 칠하고 행을 다시 모아 그림으로 만듭니다.
  3. ax에 그림을 그리고 표시합니다.

5가지 잉크로 그린 이 석양처럼요.

5가지 단색으로 다시 칠하고 제목을 5가지 잉크로 붙인 석양: 자두색과 장밋빛 하늘 띠, 주황색 띠, 노란 태양, 주황색 줄무늬가 있는 남색 바다

프로그램은 아무것도 출력하지 않습니다. Coddy가 그림과 잉크를 설명합니다. 그런 다음 k에 다른 값을 넣어 보세요. 언제 빨간 보트가 자기만의 잉크를 갖게 될까요?

직접 해보기

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


# 하늘, 눈 덮인 산봉우리, 숲, 호수, 빨간 배가 있는 40 x 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 컴파일러