«Доминантный цвет» сложно. Что вы хотите сделать, это сравнить расстояние между каждым пикселем и каждым другим пикселем в цветовом пространстве (евклидово расстояние), а затем найти пиксель, цвет которого ближе всего к любому другому цвету. Этот пиксель является доминирующим цветом. Средний цвет обычно будет грязным.
Хотелось бы, чтобы у меня был MathML, чтобы показать вам евклидово расстояние. Google это.
Я выполнил вышеупомянутое выполнение в цветовом пространстве RGB, используя PHP / GD здесь: https://gist.github.com/cf23f8bddb307ad4abd8
Это, однако, очень вычислительно дорого. Это приведет к сбою вашей системы на больших изображениях и обязательно приведет к сбою вашего браузера, если вы попробуете это в клиенте. Я работал над рефакторингом своего исполнения, чтобы:
- сохранить результаты в таблице поиска для будущего использования в итерации по каждому пикселю.
- разделить большие изображения на сетки размером 20 на 20 пикселей для локализованного доминирования.
- использовать евклидово расстояние между x1y1 и x1y2, чтобы вычислить расстояние между x1y1 и x1y3.
Пожалуйста, дайте мне знать, если вы добьетесь прогресса в этом направлении. Я был бы счастлив увидеть это. Я сделаю то же самое.
Canvas - лучший способ сделать это на клиенте. SVG нет, SVG является векторным. После того, как я завершу выполнение, я хочу запустить его на холсте (возможно, с помощью веб-мастера для расчета общего расстояния каждого пикселя).
Еще одна вещь, о которой стоит подумать, это то, что RGB не является хорошим цветовым пространством для этого, потому что евклидово расстояние между цветами в пространстве RGB не очень близко к визуальному расстоянию. Лучшим цветовым пространством для этого может быть LUV, но я не нашел хорошей библиотеки для этого или каких-либо алгоритмов для преобразования RGB в LUV.
Совершенно другой подход заключается в сортировке цветов в радуге и построении гистограммы с допуском, учитывающим различные оттенки цвета. Я не пробовал этого, потому что сортировать цвета в радуге сложно, как и цветовые гистограммы. Я мог бы попробовать это дальше. Опять же, дайте мне знать, если вы добьетесь прогресса здесь.