На сегодняшний день такие задачи, как распознавание образов, сегментация и анализ изображений, являются одними из наиболее актуальных задач и интенсивно развиваемых направлений исследования в области компьютерного зрения.
Сегментация изображений – одна из основных процедур обработки изображений, используемых в робототехнике, медицине, видеонаблюдении, спутниковом мониторинге земной поверхности. Эта процедура является предварительным этапом любой обработки изображений, так как позволяет упростить последующий анализ однородных областей изображения, их яркость и геометрических характеристик[1].
Нахождение преобладающих цветов на изображения может помочь в оценке качества проведённой сегментации изображения.
Метод K-средних
Метод k-средних[2] – это метод кластерного анализа, целью которого является разделение m наблюдений (из пространства Rn) на k кластеров , при этом каждое наблюдение относится к тому кластеру, к центру (центроиду) которого оно ближе всего.
Все пиксели изображения являются исследуемым объектами и описываются как наблюдения - Х в пространстве Rn. Начальными данными считается ряд наблюдений:
Х(j)= (Х(1), Х(2), …, Х(m)), Х(j) ∈ Rn
m – количество наблюдений.
Рисунок 1 – График наблюдений Х в пространстве Rn
В качестве меры близости используется Евклидово расстояние:
,
где ∈ Rn.
Метод k-средних разделяет m наблюдений на k групп (или кластеров) (k ≤ m) S = {S1, S2, …, Sk} , чтобы минимизировать суммарное квадратичное отклонение точек кластеров от центроидов этих кластеров:
,
где ∈ Rn , ∈ Rn .
– центроид кластера Si.
Если мера близости до центроида определена, то разбиение объектов на кластеры сводится к определению центроидов этих кластеров. На первом этапе центроиды кластеров выбираются случайно или по определенному правилу (например, выбрать центроиды, максимизирующие начальные расстояния между кластерами). Относим наблюдения к тем кластерам, чье среднее (центроид) к ним ближе всего.
Центроид каждого i-го кластера перевычисляется по следующему правилу:
.
Алгоритм k-средних заключается в перевычислении на каждом шаге центроида для каждого кластера, полученного на предыдущем шаге.
Алгоритм останавливается, когда значения не меняются:
OpenCV
Библиотека алгоритмов компьютерного зрения, обработки изображений с открытым кодом. Имеет интерфейсы C ++, C, Python и Java и поддерживает Windows, Linux, Mac OS, iOS и Android[3].
Применяется для утверждения общего стандартного интерфейса компьютерного зрения для приложений в этой области.
Нахождение преобладающих цветов на изображения
Для нахождения преобладающих цветов на изображения воспользуемся библиотекой OpenCV и методом k-средних. Библиотека OpenCV на данный момент наилучшим образом оптимизирована под Unixподобные системы.
Выбрана новейшая операционная система Ubuntu Desktop 16.04.1[4]. Операционная система была установлена на компьютер в качестве второй ОС.
Фрагмент кода показывающий подключение необходимых пакетов и библиотек, представлено на рисунке 2.
from sklearn.cluster import KMeans import matplotlib.pyplot as plt import argparse import utils import cv2 |
Рисунок 2 – Импорт библиотек
Фрагмент кода, необходимый для инициализации параметров, представлен на рисунке 3, в нашем случае два аргумента: «изображение» - путь до папки, в котором лежит изображение; «кластеры» - количество кластеров, которое мы хотим сгенерировать.
ap.add_argument("-i", "--изображение",required = True) ap.add_argument("-c", "--кластеры", required = True, type = int) |
Рисунок 3 – Инициализация параметров
Важная особенность OpenCV, представление изображения как многомерные массивы NumPy и сохранения изображений в цветах BGR. Для того, чтобы вернуться к стандартному RGB, используем функцию cv2.COLOR_BGR2RGB, фрагмент кода на рисунке 4.
image = cv2.imread(args["image"]) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) |
Рисунок 4 – Конвертация изображения
Для того, чтобы сгенерировать кластеры необходимо матрицу пикселей преобразовать в вектор пикселей, используем фрагмент кода, представленный на рисунке 5.
image = image.reshape((image.shape[0] * image.shape[1], 3)) |
Рисунок 5 – Преобразование матрицы в вектор
Для нахождения преобладающих цветов и разбиения их на кластеры, используем фрагмент кода, представленный на рисунке 6, в который подставляется количество кластером, заданное при запуске программы.
clt = KMeans(n_clusters = args["clusters"]) clt.fit(image) |
Рисунок 6 – Поиск преобладающих цветов
Для построения гистограммы используется фрагмент кода, представленный на рисунке 7.
def centroid_histogram(clt): numLabels = np.arange(0, len(np.unique(clt.labels_)) + 1) (hist, _) = np.histogram(clt.labels_, bins = numLabels) hist = hist.astype("float") hist /= hist.sum() |
Рисунок 7 – Построение гистограммы
Для того, чтобы построить гистограмму необходимо подсчитать количество пикселей, принадлежащих тому или иному кластеру, используем фрагмент кода, представленный на рисунке 8.
def plot_colors(hist, centroids): bar = np.zeros((50, 300, 3), dtype = "uint8") startX = 0 for (percent, color) in zip(hist, centroids): # plot the relative percentage of each cluster endX = startX + (percent * 300) cv2.rectangle(bar, (int(startX), 0), (int(endX), 50), color.astype("uint8").tolist(), -1) startX = endX |
Рисунок 8 – Построение гистограммы
Для проверки нахождение преобладающих цветов на изображения на вход подается изображение. В терминале ОС Ubuntu следует прописать путь изображения и указать количество необходимых кластеров.
В результате на выходе получаем отображение исходного изображения и гистограмму нахождение преобладающих цветов на изображения, результаты работы программы представлены на рисунках 9 и 10.
Рисунок 9 – Результат работы программы
Таким образом, видим, что на рисунке 9 программе было задано выделить три преобладающих цвета, а на рисунке 10 - два цвета.
Рисунок 10 – Результат работы программы
Выводы
На сегодняшний день задачи компьютерного зрения являются одними из самых актуальных в информационном обществе. Библиотеку OpenCV с каждым днём используют всё больше людей. В данной статье рассмотрен метод k-средних, использующийся для кластеризации, описана реализация нахождения преобладающих цветов на изображение. В результате работы программа отображает исходное изображение и гистограмму нахождение преобладающих цветов на изображения.
Список источников и литературы
Вежневец В. Введение в компьютерное зрение: Курс лекций / Вежневец В., Конушин А., Вежневец А.— М.: МГУ, 2006.
https://nlp.stanford.edu/IR-book/html/htmledition/k-means-1.html
https://opencv.org/
ОС Ubuntu: http://ubuntu.ru/
Онлайн-курсы: https://www.coursera.org