Введение
Квантование цвета - это процесс уменьшения количества различных цветов, используемых в изображении, при сохранении его общего вида. Это достигается путём группировки похожих цветов вместе и представления их одним значением цвета. В этом лабе мы будем использовать алгоритм кластеризации K-Means для выполнения квантования цвета на изображении Замка Летнего Дома в Китае.
Советы по работе с ВМ
После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Ноутбук и получить доступ к Jupyter Notebook для практики.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook загрузится. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Загрузка и отображение исходного изображения
Начнём с загрузки и отображения исходного изображения Замка Летнего Дома.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_sample_image
## Load the Summer Palace photo
china = load_sample_image("china.jpg")
## Display the original image
plt.figure()
plt.axis("off")
plt.title("Original Image")
plt.imshow(china)
plt.show()
Преобразование изображения в числа с плавающей точкой и изменение формы
Мы преобразуем изображение в числа с плавающей точкой и изменим его форму на 2D-массив NumPy, чтобы его можно было обработать с использованием алгоритма K-Means.
## Convert to floats instead of the default 8 bits integer coding.
china = np.array(china, dtype=np.float64) / 255
## Get the dimensions of the image
w, h, d = original_shape = tuple(china.shape)
assert d == 3
## Reshape the image into a 2D numpy array
image_array = np.reshape(china, (w * h, d))
Настройка модели K-Means
Мы настроим модель K-Means на небольшой подвыборке данных изображения и используем её для предсказания индексов цветов на полном изображении.
from sklearn.cluster import KMeans
from sklearn.utils import shuffle
from time import time
n_colors = 64
## Fit the K-Means model on a small sub-sample of the data
print("Fitting model on a small sub-sample of the data")
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.")
## Get labels for all points
print("Predicting color indices on the full image (k-means)")
t0 = time()
labels = kmeans.predict(image_array)
print(f"done in {time() - t0:0.3f}s.")
Предсказание индексов цветов с использованием случайного кодбука
Мы будем предсказывать индексы цветов на полном изображении с использованием случайного кодбука.
## Get a random codebook
codebook_random = shuffle(image_array, random_state=0, n_samples=n_colors)
## Predict color indices on the full image using the random codebook
print("Predicting color indices on the full image (random)")
t0 = time()
labels_random = pairwise_distances_argmin(codebook_random, image_array, axis=0)
print(f"done in {time() - t0:0.3f}s.")
Воссоздание изображения
Мы воссоздадим сжатое изображение с использованием кодбука и меток, полученных из модели K-Means и случайного кодбука.
def recreate_image(codebook, labels, w, h):
"""Recreate the (compressed) image from the code book & labels"""
return codebook[labels].reshape(w, h, -1)
## Display the original image alongside the quantized images
plt.figure()
plt.clf()
plt.axis("off")
plt.title("Original image (96,615 colors)")
plt.imshow(china)
plt.figure()
plt.clf()
plt.axis("off")
plt.title(f"Quantized image ({n_colors} colors, K-Means)")
plt.imshow(recreate_image(kmeans.cluster_centers_, labels, w, h))
plt.figure()
plt.clf()
plt.axis("off")
plt.title(f"Quantized image ({n_colors} colors, Random)")
plt.imshow(recreate_image(codebook_random, labels_random, w, h))
plt.show()
Резюме
В этом практическом занятии мы узнали, как использовать алгоритм кластеризации K-Means для выполнения квантования цветов на изображении. Мы загрузили и отобразили исходное изображение, преобразовали его в числа с плавающей точкой и изменили форму на 2D-массив NumPy. Мы настроили модель K-Means на подвыборке данных изображения и использовали её для предсказания индексов цветов на полном изображении. Мы также предсказали индексы цветов на полном изображении с использованием случайного кодбука. Наконец, мы воссоздали сжатое изображение с использованием кодбука и меток, полученных из модели K-Means и случайного кодбука, и отобразили исходное изображение вдоль сжатых изображений.