Открыть список
Как стать автором
Обновить

Комментарии 17

Очень напоминает практическое задание из курса Andrew Ng :)
А можно подробнее, что это за курсы? Именно по питону? Где найти/почитать?
Спасибо!

И вообще, вопрос для знатоков: подскажите пожалуйста интересные упражнения/задания/курсы/уроки. Python, C++, Perl, Java.
Это новый формат курсов, курс AndrewNG один из многих, полный список можно посмотреть тут coursera.org
Средние цвета не очень, не сохраняют восприятие исходной картинки. Например в предпоследнем варианте нет синего, его мало, но без него плохо. Использование доминирующих цветов тоже считаю неполноценным. Удачные палитры получаются только на контрастных изображениях или когда цель именно в получении пастельных оттенков. Вот возьмем кусок градиента, получим средние цвета, которые неприменимы для повторения эффекта.

Не знаете ли готовых решений составления палитр по изображению, так чтобы прямоугольники цветов были пропорциональны частоте использования цвета и упорядочены в соответствии с сочетаниями их в картинке?
Как ни странно, применение моему скрипту нашлось. =)
И это не дизайнеры, а ребята наполнявшие свои сайты товаром, который можно фильтровать по цвету: косметика, плитка итд.
Мне кажется k-means не очень подходящий алгоритм кластеризации для данной задачи. Основная проблема при использовании k-means заключается в том, что нужно заранее определять сколько кластеров будет на выходе. Таким образом, если, например, картинка будет состоять из 7 полосок разного цвета, а мы задали кол-во кластеров равное 3 (как у вас), то на выходе мы получим цвета не соответствующие цветам этих полосок.
Например можно задать пороговое значение евклидового расстояния между точками (значение в пределах 1-360, RGB система), по которому определяется соответствие цвета той или иной группе (входит точка в шар радиусом равным этому расстоянию или нет, если нет — новая группа), но тогда заранее не будет известно сколько цветовых групп получится :)
Вот как раз поэтому в данном случае и нужно использовать другие алгоритмы кластеризации, в которых кол-во кластеров определяется в процессе работы алгоритма.
Тогда мой вариант подходит, там количество кластеров определяется в процессе работы алгоритма.
Можно, например запускать k-means с разными значениями числа кластеров, и выбирать наиболее подходящий результат. Остаётся, правда, вопрос, что такое наиболее подходящий результат. Для этого придётся понять, зачем делается кластеризация.
позавчера искал алгоритмы!
спасибо :)
Интересно, как меняется результат при использовании других расстояний между двумя цветами. К сожалению, в этом случае придётся ещё думать, как правильно искать центр кластера.
У себя на сайте использую только средний цвет всей картинки, в том числе поиск. Если сделать 3 средних цвета то искать подобные картинки будет гораздо точнее.
Сам сайт тоже на Python+PIL но так как больше 200 000 надо бы такой алгоритм на С переписать.

А если ещё добавить кривезну контрастных участков то можно очень неплохо искать похожие картинки…
А вот если взять какой-нибудь алгоритм который понижает цветность картинки с уётом какого-нибудь качественного дизеринга, а потом взять результирующую палитру? Я конечно понимаю, что останется проблема подбора количества цветов, но резулььтат должен получиться удовлетворительный?
Хоть статья чисто для ознакомления с темой и на любителя, но все равно внесу свои две копейки.
Во-первых, зачем писать на питоне чистые вычисления?
Во-вторых, есть 2 реализации шага по методу к-средних: со сложностью N^2 и почти линейной (вычисляется центр масс на каждом шагу и находится ближайшая к нему точка).
В-третьих, для оптимизации не нужно вычислять корень из расстояния, он не нужен и является очень долгой по времени операцией.
Ну и в-четвертых, одного метода к-средних для данной задачи недостаточно. Есть целое семейство алгоритмов оптимального разбиения на классы, например, метод Максимина.
Также для оптимизации, при распределении точек по классам на каждом шагу удобно создавать массив с индексами точек для каждого класса для дальнейшего анализа по к-средних (меморизация).
Учитывая все вышеупомянутое, моя реализация (без распараллеливания) разбивает на классы миллион точек по максимину за 1-2 секунды, далее по к-средних в среднем по секунде на шаг на мобильном двухъядерном атлоне.
Сам по себе комплекс теории называется «методы и алгоритмы принятия решений».
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.