Данные блуждания

Изучение основных цветов изображения с помощью k-средних

Пересекая данные и фотографию, чтобы найти мои предпочтительные цвета

Цветовые предпочтения, как и многое другое в жизни, - это внутреннее и уникальное качество человека. У вас есть любимый цвет, но, более того, я хочу сказать, что у вас есть предпочтительный тон для многих вещей, которыми вы владеете. Например, вы предпочитаете определенный цвет для своей обуви, другой - для чехла для телефона, а в моем случае я склоняюсь к некоторым цветам при работе с фотографией.

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

Чтобы подтвердить свои убеждения, а также найти способ объединить мою страсть к данным и фотографии, я решил использовать машинное обучение, особенно классический алгоритм неконтролируемого обучения, k-средних для кластеризации пикселей некоторых моих изображений и узнайте, какие цвета являются ведущими или доминирующими. Более того, чтобы лучше понять фотографии и дополнить основную часть анализа, я буду проецировать изображения в другое представление, используя алгоритм уменьшения размерности t-распределенное стохастическое вложение соседей или t- SNE.

Данные

В этом эксперименте я найду основные цвета девяти фотографий, сделанных во время моего недавнего визита в Австрию и Сингапур.

Инструменты

Этот эксперимент проводится на Python, и он использует библиотеку scikit-learn для соответствия модели k-средних, OpenCV для управления изображениями и HyperTools для проектирования пространства с использованием t -SNE.

Эксперимент

Давайте посмотрим на это изображение, которое я сделал в Сингапуре. Какие цвета ты видишь? Какие из них самые распространенные? Для нас, людей, это довольно просто. Сначала мы можем сказать несколько оттенков серого, синего и немного оранжевого. Что говорит алгоритм? Можем ли мы это автоматизировать? Конечно, но прежде чем приступить к делу, я хочу спроецировать красный, зеленый и синий каналы с помощью t-SNE, чтобы немного лучше понять, что на самом деле здесь происходит.

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

Следующие три изображения являются t-SNE-представлением различных цветовых каналов предыдущего изображения.

На каждом из этих изображений мы можем видеть разные группы пикселей. Моя интерпретация этих змееподобных групп состоит в том, что каждая из них описывает похожие тона в пределах своего цветового канала. Например, график красного канала состоит из пяти разных групп, и они могут представлять разные оттенки красного, такие как светлые тона и насыщенные тона. Однако являются ли эти группы ведущими? Давайте разберемся.

Перед подгонкой модели мне пришлось изменить форму данных изображения. По умолчанию цветное изображение представляет собой трехмерную матрицу, состоящую из ширины, длины и трех цветовых каналов изображения. Для этого приложения мы собираемся преобразовать это векторное пространство в 2D-фрейм данных, состоящий из width*lenght строк и 3 столбцов (по одному для каждого цвета). Затем мы можем кластеризоваться.

Алгоритм кластеризации эксперимента представляет собой k-средство, алгоритм обучения без учителя, который группирует наблюдения данных таким образом, что каждая точка группируется с другими, похожими на нее. В этом проекте я выбрал k=10, что означает, что мы получим 10 доминирующих цветов.

Следующий фрагмент кода показывает процесс.

После того, как мы сгруппировали данные, нам нужно найти способ извлечь эту информацию и визуализировать ее. Итак, я построил гистограмму, используя в качестве входных данных результат кластеризации и k в качестве количества ячеек. Результатом является список подсчета частоты, который показывает, сколько пикселей попало под каждую метку. Затем мы нормализуем список, чтобы получить список процентов пикселей под каждой меткой. Короче говоря, в этой части мы суммируем, сколько пикселей принадлежит каждому кластеру.

Это функция.

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

А теперь посмотрим на результат. Это ведущие цвета имиджа Сингапура.

Полосы в правой части изображения - это ведущие цвета, найденные алгоритмом. Первые два цвета, представляющие собой оттенки серого, в основном появляются в облаках, воде и в тени изображения. Затем у нас есть синий цвет, который присутствует в небе и воде. Наконец, есть зелень от деревьев.

Вы согласны с выводами алгоритма?

Давайте посмотрим на другие примеры изображений и их основные цвета. Первые четыре фотографии из Сингапура, остальные из Австрии. Можете ли вы найти какую-то особенность в моем выборе цветов в зависимости от региона?

Заключение и резюме

В этой статье я показал методику поиска ведущих цветов изображения с помощью k-средних и Python. Лично я доволен результатами. Несмотря на то, что результат не был идеальным - некоторые очевидные ведущие цвета не были обнаружены, - я бы сказал, что он смог передать суть цветов, которые я обычно использую в своих изображениях - серый, темно-синий и коричневый.

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

Спасибо за прочтение. Если у вас есть вопросы, сомнения или просто хотите пообщаться, оставьте мне комментарий, и я с радостью отвечу.

Исходный код этого эксперимента доступен на моем GitHub здесь



Эта статья является частью моей серии Wander Data, в которой я рассказываю и переживаю свои истории о путешествиях с данными. Чтобы увидеть больше о проекте, посетите wanderdata.com.