Причина, по которой CIE LAB часто используется для кластеризации, заключается в том, что он уменьшает цвет до 2 измерений (в отличие от RGB с 3 цветовыми каналами). Вы можете легко придумать цвет для каждого пикселя в декартовой системе координат, вместо точек (x,y)
у вас есть точки (a,b)
Отсюда вы просто выполняете 2d kmeans.
Как именно вы реализуете kmeans, зависит от вас. Хорошая вещь в сведении цветов к двумерному пространству заключается в том, что мы можем представить данные на сетке, и теперь мы можем использовать любую регулярную меру расстояния, какую захотим. Махалонобис, евклидова, 1 норма, городской квартал и т. д. Возможности здесь действительно безграничны.
Вам не обязательно использовать CIELAB, вы можете так же легко использовать YCbCr, YUV или любое другое цветовое пространство, представляющее цвет в двух измерениях. ЕСЛИ вы хотите попробовать 3d kmeans, вы можете использовать rgb, hsv и т. д. Одной из проблем с более высокой размерностью является разреженность кластеров (большая дисперсия) и, что наиболее важно, увеличение времени вычислений.
Просто для удовольствия я включил два изображения, сгруппированные с использованием kmeans, одно в LAB и одно в YCbCr, вы можете видеть, что кластеризация почти идентична (за исключением того, что метки разные), просто доказывая, что точное цветовое пространство не имеет значения, главное смысл в том, чтобы сопоставить размерность ваших kmeans с размерностью ваших данных
ИЗМЕНИТЬ
Вы сделали несколько хороших замечаний в своих комментариях. Я просто продемонстрировал, что, абстрагируя проблему, вы можете вообразить множество вариантов одного и того же базового алгоритма кластеризации. Но вы правы, в использовании CIELAB есть свои преимущества.
Вернемся к измерению расстояния. Kmeans имеет два шага: назначение и обновление (это очень похоже на алгоритм максимизации ожидания). Это расстояние используется на шаге назначения k-средних. Вот какой-то псевдокод
for each pixel 1 to rows*cols
for each cluster 1 to k
dist[k] = calculate_distance(pixel, mu[k])
pixel_id = index k of minimum dist
вы должны создать функцию calculate_distance
, которая использует расчет delta_e
из cielab94. Эта формула использует все 3 канала для расчета расстояния. Надеюсь, это ответит на ваши вопросы
ПРИМЕЧАНИЕ В моих примерах используются только два цветовых канала, игнорируя канал яркости. Я использовал эту технику, поскольку часто целью является группировка цветов, несмотря на несоответствие освещения (например, тени). Мера delta_E
не является светоинвариантной. Это может или не может быть проблемой для вашего приложения, но об этом следует помнить.
результаты с использованием квадратного евклидова расстояния
результаты с использованием расстояния городского квартала
27.05.2015