Введение
В этом практическом занятии показано, как использовать KBinsDiscretizer из библиотеки Scikit-learn для выполнения векторной квантования на образце изображения浣熊 face. Векторное квантование - это техника уменьшения количества градаций серого, используемых для представления изображения. Мы будем использовать KBinsDiscretizer для выполнения векторного квантования на изображении浣熊 face. Мы будем использовать 8 градаций серого для представления изображения, которое можно сжать до использования только 3 бит на пиксель. Мы сравним стратегии равномерного и k-средних кластеризации для отображения значений пикселей на 8 градациях серого.
Советы по работе с ВМ
После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Загрузка и отображение исходного изображения
Начнем с загрузки изображения浣熊 face из Scipy. Отобразим изображение и проверим его размер, тип данных и использование памяти.
from scipy.misc import face
import matplotlib.pyplot as plt
raccoon_face = face(gray=True)
print(f"The dimension of the image is {raccoon_face.shape}")
print(f"The data used to encode the image is of type {raccoon_face.dtype}")
print(f"The number of bytes taken in RAM is {raccoon_face.nbytes}")
fig, ax = plt.subplots(ncols=2, figsize=(12, 4))
ax[0].imshow(raccoon_face, cmap=plt.cm.gray)
ax[0].axis("off")
ax[0].set_title("Original Image")
ax[1].hist(raccoon_face.ravel(), bins=256)
ax[1].set_xlabel("Pixel value")
ax[1].set_ylabel("Count of pixels")
ax[1].set_title("Distribution of the pixel values")
_ = fig.suptitle("Original Image of a Raccoon Face")
Векторное квантование с использованием KBinsDiscretizer
Теперь мы будем использовать KBinsDiscretizer для выполнения векторного квантования на изображении浣熊 face. Мы будем использовать 8 градаций серого для представления изображения, которое можно сжать до использования только 3 бит на пиксель. Мы будем использовать стратегии равномерного и k-средних кластеризации для отображения значений пикселей на 8 градациях серого.
Стратегия равномерного выборки
Сначала мы будем использовать стратегию равномерного выборки для отображения значений пикселей на 8 градациях серого.
from sklearn.preprocessing import KBinsDiscretizer
n_bins = 8
encoder = KBinsDiscretizer(
n_bins=n_bins, encode="ordinal", strategy="uniform", random_state=0
)
compressed_raccoon_uniform = encoder.fit_transform(raccoon_face.reshape(-1, 1)).reshape(
raccoon_face.shape
)
fig, ax = plt.subplots(ncols=2, figsize=(12, 4))
ax[0].imshow(compressed_raccoon_uniform, cmap=plt.cm.gray)
ax[0].axis("off")
ax[0].set_title("Uniform Sampling")
ax[1].hist(compressed_raccoon_uniform.ravel(), bins=256)
ax[1].set_xlabel("Pixel value")
ax[1].set_ylabel("Count of pixels")
ax[1].set_title("Distribution of the pixel values")
_ = fig.suptitle("Raccoon face compressed using 3 bits and a uniform strategy")
Стратегия k-средних кластеризации
Теперь мы будем использовать стратегию k-средних кластеризации для отображения значений пикселей на 8 градациях серого.
encoder = KBinsDiscretizer(
n_bins=n_bins, encode="ordinal", strategy="kmeans", random_state=0
)
compressed_raccoon_kmeans = encoder.fit_transform(raccoon_face.reshape(-1, 1)).reshape(
raccoon_face.shape
)
fig, ax = plt.subplots(ncols=2, figsize=(12, 4))
ax[0].imshow(compressed_raccoon_kmeans, cmap=plt.cm.gray)
ax[0].axis("off")
ax[0].set_title("K-Means Clustering")
ax[1].hist(compressed_raccoon_kmeans.ravel(), bins=256)
ax[1].set_xlabel("Pixel value")
ax[1].set_ylabel("Count of pixels")
ax[1].set_title("Distribution of the pixel values")
_ = fig.suptitle("Raccoon face compressed using 3 bits and a K-means strategy")
Затраты памяти
Теперь мы проверим использование памяти сжатых изображений. Мы ожидаем, что сжатое изображение займет в 8 раз меньше памяти, чем исходное.
print(f"The number of bytes taken in RAM is {compressed_raccoon_kmeans.nbytes}")
print(f"Compression ratio: {compressed_raccoon_kmeans.nbytes / raccoon_face.nbytes}")
Резюме
В этом практическом занятии мы использовали KBinsDiscretizer из библиотеки Scikit-learn для выполнения векторного квантования на образце изображения浣熊 face. Мы использовали 8 градаций серого для представления изображения, которое можно сжать до использования только 3 бит на пиксель. Мы сравнили стратегии равномерного и k-средних кластеризации для отображения значений пикселей на 8 градациях серого. Мы обнаружили, что стратегия k-средних кластеризации обеспечивает более сбалансированное распределение значений пикселей. Мы также проверили использование памяти сжатых изображений и обнаружили, что сжатое изображение занимает в 8 раз больше памяти, чем исходное, из-за использования 64-разрядного представления с плавающей запятой для сжатого изображения.
Резюме
Поздравляем! Вы завершили практическое занятие по векторному квантованию с использованием KBinsDiscretizer. Вы можете выполнить больше практических занятий в LabEx, чтобы улучшить свои навыки.