Квантование цвета с использованием K-Means в Scikit Learn

Опубликовано: 21 Февраля, 2023

В этой статье мы поиграем со значением интенсивности пикселей, используя алгоритмы машинного обучения. Цель состоит в том, чтобы выполнить пример квантования цвета с использованием KMeans в библиотеке Scikit Learn.

Квантование цвета

Квантование цвета — это метод, при котором цветовые пространства в изображении сводятся к количеству различных цветов. Даже после квантования цвета новое изображение визуально похоже на исходное изображение.

Квантование цвета в основном используется для отображения или визуализации изображений с большим количеством пробелов на тех устройствах, которые могут отображать только ограниченное количество цветов, в основном из-за ограничений памяти. Этот метод позволяет алгоритмам сжатия отображать изображение на тех устройствах, где дисплей ограничен числом оттенков.

K-Means — это алгоритм кластеризации обучения без учителя, который имеет дело с кластеризацией на основе плотности. В этой статье мы будем использовать алгоритм K-средних для выполнения квантования цвета в изображении.

Квантование цвета с использованием K-Means в Scikit Learn

Во-первых, мы импортируем необходимые модули:

  • NumPy
  • OpenCV
  • Матплотлиб
  • Scitkit-узнать

Python3




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

Если приведенный выше код выдает ImportError, используйте команду pip install для установки пакетов.

Затем нам нужно прочитать изображение, для которого мы будем использовать OpenCV.

Python3




original_image = cv2.imread("lena.jpg")
plt.imshow(cv2.cvtColor(original_image, cv2.COLOR_BGR2RGB))
plt.axis("off")

Выход:

После этого нам нужно изменить форму изображения, т.е. сгладить изображение, чтобы передать модель.

Python3




reshaped_image = np.reshape(
    original_image,
      ((original_image.shape[0] * original_image.shape[1]), 3))

KMeans — это алгоритм кластеризации, значение k следует процедуре. Процедура состоит в применении алгоритма KMeans с числом кластеров, равным количеству цветов, для которых требуется выполнить операцию квантования.

Python3




model = KMeans(n_clusters=64)
target = model.fit_predict(reshaped_image)
color_space = model.cluster_centers_

Так как полученное color_space имеет число с плавающей запятой, нам нужно преобразовать его в целое число без знака, чтобы визуализировать изображение. Мы возвращаем исходную форму изображения, т. е. отменяем сглаживание.

Python3




output_image = np.reshape(color_space.astype(
    "uint8")[target], (original_image.shape[0], original_image.shape[1], 3))
con_image = cv2.cvtColor(output_image, cv2.COLOR_BGR2RGB)
plt.imshow(con_image)
plt.axis("off")

Выход:

Вывод

Изображения выглядят одинаково, но выходное изображение намного сжимаемее по сравнению с входным изображением. Мы можем использовать разные значения n_clusters для получения лучших результатов.