Кластерный анализ (англ. Data clustering) – задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались.
В рамках данной лабораторной работы будет решаться задача кластерного анализа изображений, собранных из задания 1.
Для начала попробуем обработать одну картинку, а именно, решим задачу определения доминирующих цветов.
Американский веб-разработчик Чарльз Лейфер (Charles Leifer) использовал метод k-средних для кластеризации цветов на изображении. Идея метода при кластеризации любых данных заключается в том, чтобы минимизировать суммарное квадратичное отклонение точек кластеров от центров этих кластеров. На первом этапе выбираются случайным образом начальные точки (центры масс) и вычисляется принадлежность каждого элемента к тому или иному центру. Затем на каждой итерации выполнения алгоритма происходит перевычисление центров масс – до тех пор, пока алгоритм не сходится.
В применении к изображениям каждый пиксель позиционируется в трёхмерном пространстве RGB, где вычисляется расстояние до центров масс. Для оптимизации картинки уменьшаются до 200х200 с помощью библиотеки PIL. Она же используется для извлечения значений RGB.
```python
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import cv2
#read image
img = cv2.imread('colors.jpg')
#convert from BGR to RGB
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#get rgb values from image to 1D array
r, g, b = cv2.split(img)
r = r.flatten()
g = g.flatten()
b = b.flatten()
#plotting
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(r, g, b)
plt.show()
```
Данный код обрабатывает изображение и определяет пять самых доминирующих цветов на изображении.
В результате исполнения кода получим график примерно такого
вида (рис. 31). На нем можно увидеть распределение пикселей в трехмерном пространстве. Здесь также легко выделить пять доминирующих цветов (рис. 32).
![Рис. 31. Распределение пикселей в трехмерном пространстве](images/2021-09-05_17-05-14.png)
Рис. 31. Распределение пикселей в трехмерном пространстве
На выходе получим пропорциональное отображение использования доминирующих цветов на изображении. Пример отображения представлен на рис. 33.
![Рис. 33. Отображение использования доминирующих цветов на изображении](images/2021-09-05_17-06-39.png)
Рис. 33. Отображение использования доминирующих цветов на изображении
## 3. Кластеризация изображении на основе доминирующих цветов
Теперь, когда получена характеристика одного изображения, у нас есть инструмент, с помощью которого можно произвести кластеризацию множества изображений на основе их доминирующих цветов. Для этого необходимо обработать каждое изображение в папке, получить его уникальную цветовую характеристику и сравнить еес другими изображениями. Поэтому немного модифицируем имеющийся код:
1) добавим глобальную переменную, в которой будем хранить цветовые характеристики каждой картинки;
2) за место конкретной картинки будем указывать директорию и будем итерационно обрабатывать каждую картинку.
```python
directory = '<ПУТЬ К ДИРЕКТОРИИ>'
for filename in os.listdir(directory):
data_iter = []
filenames.append(filename)
img = str(directory) + '\\' + filename
#print (img)
clusters = 2
dc = DominantColors(img, clusters)
colors = dc.dominantColors()
for i in colors:
for j in i:
data_iter.append(j)
data.append(data_iter)
print(colors)
```
Преобразуем список в массив данных и добавим код метода главных компонент для того, чтобы понизить размерность вектора характеристик с 15 до 3.
```python
np_data = np.asarray(data, dtype=np.float32)
import numpy as np
from sklearn.decomposition import PCA
pca = PCA(n_components = 3)
XPCAreduced = pca.fit_transform(np_data)
print(XPCAreduced)
print(filenames)
```
Далее представим точки изображения на плоскости, где координатами будут элементы вектора характеристик.