K-평균을 이용한 색상 양자화

Beginner

This tutorial is from open-source community. Access the source code

소개

색상 양자화는 이미지에서 사용되는 고유 색상의 수를 줄이면서 전체적인 외관을 유지하는 프로세스입니다. 이는 유사한 색상을 클러스터링하고 단일 색상 값으로 표현하여 수행됩니다. 이 실험에서는 중국 여름궁전 이미지에 대한 색상 양자화를 수행하기 위해 K-평균 클러스터링 알고리즘을 사용할 것입니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습을 위한 Jupyter Notebook에 접근할 수 있습니다.

때때로 Jupyter Notebook 이 완전히 로드되기까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사를 자동화할 수 없습니다.

학습 중 문제가 발생하면 Labby 에 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.

원본 이미지 로드 및 표시

여름궁전의 원본 이미지를 로드하고 표시하는 것으로 시작하겠습니다.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_sample_image

## 여름궁전 사진 로드
china = load_sample_image("china.jpg")

## 원본 이미지 표시
plt.figure()
plt.axis("off")
plt.title("원본 이미지")
plt.imshow(china)
plt.show()

이미지를 부동소수점으로 변환 및 형상 변경

이미지를 부동소수점으로 변환하고 K-평균 알고리즘에서 처리할 수 있도록 2 차원 NumPy 배열로 형상을 변경합니다.

## 기본 8 비트 정수 코드 대신 부동소수점으로 변환합니다.
china = np.array(china, dtype=np.float64) / 255

## 이미지의 차원을 가져옵니다.
w, h, d = original_shape = tuple(china.shape)
assert d == 3

## 이미지를 2 차원 NumPy 배열로 형상을 변경합니다.
image_array = np.reshape(china, (w * h, d))

K-평균 모델 적합

이미지 데이터의 작은 하위 샘플에 K-평균 모델을 적합하고 전체 이미지에 대한 색상 인덱스를 예측하는 데 사용합니다.

from sklearn.cluster import KMeans
from sklearn.utils import shuffle
from time import time

n_colors = 64

## 데이터의 작은 하위 샘플에 K-평균 모델을 적합합니다.
print("데이터의 작은 하위 샘플에 모델 적합")
t0 = time()
image_array_sample = shuffle(image_array, random_state=0, n_samples=1000)
kmeans = KMeans(n_clusters=n_colors, n_init="auto", random_state=0).fit(
    image_array_sample
)
print(f"done in {time() - t0:0.3f}s.")

## 모든 점에 대한 레이블 가져오기
print("전체 이미지에 대한 색상 인덱스 예측 (k-평균)")
t0 = time()
labels = kmeans.predict(image_array)
print(f"done in {time() - t0:0.3f}s.")

임의 코드북을 사용한 색상 인덱스 예측

전체 이미지에 대한 색상 인덱스를 임의 코드북을 사용하여 예측합니다.

## 임의 코드북 가져오기
codebook_random = shuffle(image_array, random_state=0, n_samples=n_colors)

## 임의 코드북을 사용하여 전체 이미지에 대한 색상 인덱스 예측
print("전체 이미지에 대한 색상 인덱스 예측 (임의)")
t0 = time()
labels_random = pairwise_distances_argmin(codebook_random, image_array, axis=0)
print(f"done in {time() - t0:0.3f}s.")

이미지 재구성

K-평균 모델과 임의 코드북에서 얻은 코드북 및 레이블을 사용하여 압축된 이미지를 재구성합니다.

def recreate_image(codebook, labels, w, h):
    """압축된 이미지를 코드북 및 레이블에서 재구성합니다."""
    return codebook[labels].reshape(w, h, -1)

## 양자화된 이미지와 함께 원본 이미지 표시
plt.figure()
plt.clf()
plt.axis("off")
plt.title("원본 이미지 (96,615 색상)")
plt.imshow(china)

plt.figure()
plt.clf()
plt.axis("off")
plt.title(f"양자화된 이미지 ({n_colors} 색상, K-평균)")
plt.imshow(recreate_image(kmeans.cluster_centers_, labels, w, h))

plt.figure()
plt.clf()
plt.axis("off")
plt.title(f"양자화된 이미지 ({n_colors} 색상, 임의)")
plt.imshow(recreate_image(codebook_random, labels_random, w, h))

plt.show()

요약

이 실습에서는 K-평균 군집화 알고리즘을 사용하여 이미지의 색상 양자화를 수행하는 방법을 배웠습니다. 원본 이미지를 로드하고 표시한 후, 부동소수점으로 변환하고 2 차원 NumPy 배열로 변형했습니다. 이미지 데이터의 하위 샘플에 K-평균 모델을 적합시키고 전체 이미지에 대한 색상 인덱스를 예측했습니다. 또한 임의 코드북을 사용하여 전체 이미지에 대한 색상 인덱스를 예측했습니다. 마지막으로, K-평균 모델과 임의 코드북에서 얻은 코드북 및 레이블을 사용하여 압축된 이미지를 재구성하고, 양자화된 이미지와 함께 원본 이미지를 표시했습니다.