Конечно, K-средства можно использовать для квантования цвета. Это очень удобно для этого.
Давайте рассмотрим пример в Mathematica :
Начнем с изображения в оттенках серого (150x150):
Давайте посмотрим, сколько уровней серого при представлении изображения в 8 битах:
ac = ImageData[ImageTake[i, All, All], "Byte"];
First@Dimensions@Tally@Flatten@ac
-> 234
Ok. Давайте уменьшим эти 234 уровня. Нашей первой попыткой будет позволить алгоритму самостоятельно определить количество кластеров с конфигурацией по умолчанию:
ic = ClusteringComponents[Image@ac];
First@Dimensions@Tally@Flatten@ic
-> 3
Он выбирает 3 кластера, и соответствующее изображение:
Теперь, если все в порядке или вам нужно больше кластеров, решать вам.
Предположим, вы решили, что необходимо более тонкое разделение цветов. Давайте попросим 6 кластеров вместо 3:
ic2 = ClusteringComponents[Image@ac, 6];
Image@ic2 // ImageAdjust
Результат:
и вот пиксельные диапазоны, используемые в каждой ячейке:
Table[{Min@#, Max@#} &@(Take[orig, {#[[1]]}, {#[[2]]}] & /@
Position[clus, n]), {n, 1, 6}]
-> {{0, 11}, {12, 30}, {31, 52}, {53, 85}, {86, 134}, {135, 241}}
и количество пикселей в каждой ячейке:
Table[Count[Flatten@clus, i], {i, 6}]
-> {8906, 4400, 4261, 2850, 1363, 720}
Итак, ответ ДА, и он прост.
Редактировать
Возможно, это поможет вам понять, что вы делаете неправильно в вашем новом примере.
Если я кластеризирую ваше цветное изображение и использую номер кластера для представления яркости, я получу:
Это потому, что кластеры не нумеруются в порядке возрастания яркости.
Но если я вычислю среднее значение яркости для каждого кластера и использую его для представления значения кластера, я получу:
В моем предыдущем примере это было не нужно, но это была просто удача: D (то есть кластеры были найдены в порядке возрастания яркости)