«Самое важное использование — отображение изображения на экране, который поддерживает только ограниченное количество оттенков, или изображение, которое необходимо сжать для целей ограничения памяти.».

Если вы энтузиаст машинного обучения, вы наверняка слышали слова «неконтролируемое машинное обучение». В этой статье я надеюсь помочь вам оценить науку и ее искусство, обсудив концепцию цветового квантования.

Я говорю «наука и искусство», потому что неконтролируемое обучение — это то место, где мы глубже погружаемся в это искусство и науку о данных. Неконтролируемое машинное обучение дает нам свободу обнаруживать кластеры и закономерности, а также интерпретировать важные компоненты данных при отсутствии «меток» или «целевых значений». Это почти как рисовать картину полностью из собственного воображения, независимо от границ предыдущей исторической картины.

Хотя алгоритмы неконтролируемого машинного обучения можно применять к разным вещам, в этой статье мы обсудим квантование цветов с использованием кластеризации K-средних (популярная модель неконтролируемого машинного обучения, которая группирует точки данных в кластеры для обнаружения потенциальных этикетки).

Квантование цвета? Что это еще за чертовщина?

Если вы когда-либо работали с цветами в Интернете, возможно, вы знакомы с «RGB» — красным, зеленым и синим. Это одна из наиболее часто используемых цветовых моделей в мире графики. Красный, зеленый и синий по сути являются основными цветами, которые используются для извлечения всех других цветов в цветовом пространстве RGB. Он является аддитивным, потому что позволяет получать широкий спектр цветов с использованием этих трех основных цветов. Каждый из этих трех цветов имеет разные значения интенсивности, которые создают вновь сгенерированный цвет для одного пикселя изображения. Другими словами, мы объединяем значение красного, значение зеленого и значение синего, чтобы получить отчетливый цвет.

Компьютер, конечно, сохраняет это как массив чисел для одного пикселя. Для более крупного цветного изображения форма сохраняется в виде трехмерного массива, содержащего высоту, ширину и цветовые каналы (значения интенсивности для RGB, помните?). Поэтому, когда вы читаете изображение и проверяете форму, вы получаете массив из трех значений. Например, (1401, 934, 3) представляет соответственно высоту, ширину и количество цветовых каналов.

Примечание: компьютер хранит только числа и не знает, какое значение связано с каким цветом. В первую очередь функция отображения изображения определяет, какой цвет связан с каждым значением интенсивности

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

Хорошо, я понял, но как, черт возьми, это вообще работает?

Вот где вступает в действие кластеризация K-средних (голосом профессора). K означает, что кластеризация по существу классифицирует объекты данных в кластеры на основе отношений между ними. Он использует метод расстояния, который определяет расстояния между этими точками данных и группирует их в соответствии с кратчайшей близостью друг к другу. Процесс можно увидеть в следующих шагах.

  1. K различных точек выбираются случайным образом (например, K=3 означает, что три кластера формируются из классификаций с тремя случайными точками), а другие точки назначаются ближайшей «точке кластера». Представьте, что вы хотите сгруппировать сборку из 20 супергероев в 3 подкоманды, чтобы спасти мир от зомби. Таким образом, вы случайным образом выбираете трех лидеров (Железный человек, Доктор Стрэндж и я) и прикрепляете к каждому лидеру другие супы в зависимости от физической близости.
  2. Вычислите центр точек кластера (среднее значение векторов точек) и назначьте каждую точку ближайшему центру кластера.
  3. Пересчитывайте центры кластеров и переназначайте точки кластеров до тех пор, пока переназначений больше не будет.

Это именно тот процесс квантования цвета. Давайте сделаем процесс более адаптированным и специфичным для квантования.

  1. Напомним, что каждый пиксель изображения имеет собственное значение RGB, которое преобразуется в цвет. Сначала мы преобразуем значения в набор функций массива X с функциями R, G и B. В том же процессе мы сглаживаем изображение, чтобы длина массива была равна высоте, умноженной на ширину. Таким образом, он становится набором функций массива 2D X.
  2. Затем мы выбираем K различных точек или K-значение цветов и применяем кластеризацию K-средних для создания назначений меток кластера.
  3. Помните, что у каждого кластера есть центр, то есть каждый центр кластера представляет собой среднее значение значений R, G и B в этом кластере. Центр представлен в формате исходного пространства признаков, то есть массива из трех значений для значений R, G и B.
  4. Мы берем каждую точку данных и преобразовываем ее в то же значение, что и центральное значение. Таким образом, мы уменьшаем все оттенки до наших значений цвета K. Если в изображении 50 различных оттенков, и мы выбираем значение цвета K, равное 8, мы объединяем эти цвета в 8 различных оттенков. Вуаля! Квантование цвета.

Давайте закодируем описанный выше процесс.

Исходное изображение, которое мы пытаемся сжать, представляет собой изображение пути ниже.

  1. Импортируйте свои библиотеки и прочитайте изображение как массив
import numpy as np
import matplotlib.image as mpimg
import matplotlib.pyplot as plt

image_as_array = mpimg.imread(r'C:\Users\olona\Downloads\pathway-2289978__480.jpg')
image_as_array # RGB CODES FOR EACH PIXEL

plt.figure(dpi=200)
plt.imshow(image_as_array) #use plt.imshow to display the image

2. Измените форму массивов с трехмерной на двумерную. Здесь мы сглаживаем изображение таким образом, что длина = h * w

image_as_array.shape
# (h,w,3 color channels)
(h,w,c) = image_as_array.shape
image_as_array2d = image_as_array.reshape(h*w,c)

3. Создайте свою модель, выберите значение K, подгоните и спрогнозируйте массив 2D-изображений. Вы можете поиграть со значением K, чтобы увидеть, какое из них вам удобно. Не существует универсального решения.

from sklearn.cluster import KMeans
model = KMeans(n_clusters=13) #our k value or K number of images is 13 (arbitrarily chosen)
labels = model.fit_predict(image_as_array2d)

4. Наконец, округлите центры кластеров до абсолютных значений и верните изображение в трехмерное (h, w и количество цветов), чтобы получить квантованное изображение.

rgb_codes = model.cluster_centers_.round(0).astype(int)
quantized_image = np.reshape(rgb_codes[labels], (h, w, c))
#remember that our quantized image has been collapsed into an array of 13 RGB intensity values
#Do not confuse the array shape for the 3 value RGB intensity values per pixel.
plt.imshow(quantized_image) #Display your quantized image
plt.savefig('quantized_image') #save to your device

Ааааааааааааааааааааа вуаля! Теперь вы можете отображать свое изображение через устройство, которое позволяет использовать только ограниченные цвета из-за ограниченной памяти.