이미지 색상
Coddy Machine Learning 여정의 비지도 학습 섹션에 포함된 레슨. 51개 중 41번째.
실크스크린 인쇄에는 잉크가 몇 가지밖에 없고, 수백만 가지 색은 없습니다. k-means는 어떤 그림이든 가장 잘 어울리는 몇 가지 색을 고릅니다:
컬러 이미지는 (행, 열, 3)의 형태를 가지며, 픽셀마다 빨강, 초록, 파랑 값이 있고 각 값의 범위는 0부터 1까지입니다. 한 번의 reshape로 픽셀을 데이터로 변환합니다:
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는 행들을 다시 그림으로 접습니다.
챌린지
중급포스터 스튜디오에서는 k개의 잉크로 산속 호수를 실크스크린 인쇄합니다. 시작 코드에서는 40×60 크기의 image를 그리고, k를 읽은 다음 제목이 있는 차트를 설정합니다.
- 이미지를 픽셀당 한 행으로 바꾸고 k-means로
k개의 색을 찾습니다. - 각 픽셀을 해당 중심의 색으로 다시 칠하고 행을 다시 모아 그림으로 만듭니다.
ax에 그림을 그리고 표시합니다.
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")
# 아래에 코드를 작성하세요
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
비지도 학습의 모든 레슨
직접 연습해 보세요: 온라인 Python 컴파일러