Я хочу разработать программу, которая поможет мне оценить 5 предварительно определенных цветов, какой из них больше похож на переменный, и с каким процентом. Дело в том, что я не знаю, как сделать это вручную, шаг за шагом. Так что еще сложнее думать о программе.
Более подробно: цвета взяты из фотографий тюбиков с гелем, которые как разные цвета. У меня есть 5 трубок с разными цветами, каждая из которых является представителем 1 из 5 уровней. Я хочу сфотографировать другие образцы и на компьютере оценить, к какому уровню относится этот образец, сравнивая цвета, и я хочу знать это также с процентным приближением. Я хотел бы программу, которая делает что-то вроде этого: http://www.colortools.net/color_matcher.html
Если вы можете сказать мне, какие шаги предпринять, даже если это вещи для меня, чтобы думать и делать вручную. Это было бы очень полезно.
Ответы:
Смотрите статью в Википедии о разнице в цвете, чтобы найти правильные выводы. По сути, вы хотите вычислить метрику расстояния в некотором многомерном цветовом пространстве. Но RGB не «восприимчиво однороден», поэтому ваша евклидова метрика расстояния RGB, предложенная Вадимом, не будет соответствовать воспринимаемому человеком расстоянию между цветами. Для начала предполагается, что L a b * является воспринимаемым однородным цветовым пространством, и обычно используется метрика deltaE. Но есть более изощренные цветовые пространства и более изощренные формулы deltaE, которые приближаются к человеческому восприятию.
Вам нужно больше узнать о цветовых пространствах и осветительных приборах, чтобы сделать преобразования. Но для быстрой формулы, которая лучше, чем евклидова метрика RGB, просто сделайте это: предположите, что ваши значения RGB находятся в цветовом пространстве sRGB, найдите формулы преобразования sRGB в L a b *, преобразуйте цвета sRGB в L a b *, и вычислите deltaE между вашими двумя значениями L a b *. Это не дорого в вычислительном отношении, это просто некоторые нелинейные формулы и некоторые умножения и сложения.
источник
color
гем, который реализует deltaE среди других цветовых операций.Просто идея, которая впервые пришла мне в голову (извините, если глупо). Три компонента цвета могут быть приняты трехмерные координаты точек, а затем вы можете рассчитать расстояние между точками.
FE
Расстояние между цветами
Процент
источник
на самом деле я прошел тот же путь пару месяцев назад. не существует идеального ответа на вопрос (который задавался здесь пару раз), но есть еще один более изощренный ответ, чем sqrt (rr) и т. д., и его проще реализовать непосредственно в RGB, не переходя во все виды альтернативных цветовых пространств. Я нашел эту формулу здесь, которая является недорогой аппроксимацией довольно сложной реальной формулы (по CIE, которая является W3C цвета, поскольку это не законченный квест, вы можете найти там более старые и более простые уравнения разности цветов). удачи
Изменить: для потомков, вот соответствующий код C:
источник
Значение цвета имеет более одного измерения, поэтому нет никакого способа сравнить два цвета. Вы должны определить для своего варианта использования значение цветов и, таким образом, как их лучше сравнить.
Скорее всего, вы хотите сравнить свойства оттенка, насыщенности и / или яркости цветов в отличие от красного / зеленого / синего компонентов. Если вам сложно понять, как вы хотите их сравнить, возьмите несколько пар образцов цветов и сопоставьте их мысленно, а затем попытайтесь объяснить / объяснить себе, почему они похожи / отличаются.
Как только вы знаете, какие свойства / компоненты цветов вы хотите сравнить, вам нужно выяснить, как извлечь эту информацию из цвета.
Скорее всего, вам просто нужно будет преобразовать цвет из общего представления RedGreenBlue в HueSaturationLightness, а затем вычислить что-то вроде
Этот пример даст вам простое скалярное значение, показывающее, насколько далеко градиент / оттенок цветов находятся друг от друга.
Смотрите HSL и HSV в Википедии .
источник
Если у вас есть два
Color
объектовc1
иc2
вы можете просто сравнить каждое значение RGB сc1
тем , что изc2
.Эти значения вы можете просто разделить на количество разностей насыщений (255), и вы получите разницу между ними.
После чего вы можете просто найти среднюю разницу цвета в процентах.
Что даст вам разницу в процентах между
c1
иc2
.источник
pctDiffRed = diffRed / 255;
даст вам 0, если вы не разыграете что-то на поплавок. <b> 2 </ b> Вам нужно будет где-то умножить на 100, чтобы получить процент.Одним из лучших методов сравнения двух цветов по человеческому восприятию является CIE76. Разница называется Delta-E. Когда оно меньше 1, человеческий глаз не может распознать разницу.
Есть замечательный цвет утилит класса ColorUtils (код ниже), который включает в себя методы сравнения CIE76. Это написано Даниэлем Штребелем, Университет Цюриха.
Из ColorUtils.class я использую метод:
r1, g1, b1 - значения RGB первого цвета
r2, g2, b2 - значения RGB второго цвета, который вы хотите сравнить
Если вы работаете с Android, вы можете получить следующие значения:
r1 = Color.red(pixel);
g1 = Color.green(pixel);
b1 = Color.blue(pixel);
ColorUtils.class Даниэля Штребеля, Университет Цюриха:
источник
Просто еще один ответ, хотя он похож на Супра - просто другое цветовое пространство.
Дело в том, что люди воспринимают разницу в цвете неравномерно, и цветовое пространство RGB игнорирует это. В результате, если вы используете цветовое пространство RGB и просто вычисляете евклидово расстояние между двумя цветами, вы можете получить разницу, которая математически абсолютно верна, но не будет совпадать с тем, что вам скажут люди.
Это может не быть проблемой - я думаю, разница не так велика, но если вы хотите решить эту проблему «лучше», вам следует преобразовать цвета RGB в цветовое пространство, специально разработанное для избежания вышеуказанной проблемы. Есть несколько улучшений по сравнению с более ранними моделями (поскольку это основано на человеческом восприятии, мы должны измерить «правильные» значения на основе экспериментальных данных). Есть цветовое пространство Lab, которое, я думаю, будет лучшим, хотя и немного сложным для преобразования. Проще было бы CIE XYZ .
Вот сайт, на котором перечислены формулы для преобразования между различными цветовыми пространствами, чтобы вы могли немного поэкспериментировать.
источник
Все приведенные ниже методы приводят к шкале от 0 до 100.
источник
Лучший способ - это deltaE. DeltaE - это число, показывающее разницу цветов. Если дельта <1, то разница не распознается человеческими глазами. Я написал код в canvas и js для преобразования rgb в lab и затем вычисления delta e. В этом примере код распознает пиксели другого цвета с базовым цветом, который я сохранил как LAB1. а затем, если он другой, эти пиксели становятся красными. Вы можете увеличивать или уменьшать чувствительность цветовой разницы с увеличением или уменьшать допустимый диапазон дельты e. В этом примере я назначил 10 для deltaE в строке, которую я написал (deltae <= 10):
}
// ------------------------------------------------ -------------------------------------------------- ---
источник
1/3
и16/116
оба оценивают0
, что почти наверняка не то, что вы хотите. Вероятно, ваш алгоритм правильный, но ваш код определенно не верен.Простой метод, который использует только RGB
Я использовал это некоторое время, и он работает достаточно хорошо для большинства целей.
источник
1/3
Я использовал это в моем Android, и это кажется удовлетворительным, хотя пространство RGB не рекомендуется:
Затем я использовал следующее, чтобы получить процент сходства:
Это работает достаточно хорошо.
источник
Я пробовал различные методы, такие как цветовое пространство LAB, сравнение HSV, и обнаружил, что яркость хорошо работает для этой цели.
Вот версия Python
Дам тебе
источник
ImageColor
? редактировать я нашел, этоfrom PIL import ImageColor
Я полагаю, вы хотите проанализировать целое изображение в конце, не так ли? Таким образом, вы можете проверить наименьшую / наибольшую разницу в индивидуальной цветовой матрице.
Большинство математических операций для обработки графики используют матрицы, потому что возможные алгоритмы, использующие их, часто бывают быстрее, чем классические вычисления расстояния до точки и сравнения. (например, для операций, использующих DirectX, OpenGL, ...)
Поэтому я думаю, что вы должны начать здесь:
http://en.wikipedia.org/wiki/Identity_matrix
http://en.wikipedia.org/wiki/Matrix_difference_equation
... и как уже говорила Беска выше:
Это означает также, что ваш алгоритм зависит от вашего определения "аналогично", если вы обрабатываете изображения.
источник
Версия Kotlin с каким процентом вы хотите соответствовать.
Вызов метода с необязательным аргументом процента
Тело метода
источник
Вам нужно будет преобразовать любые цвета RGB в цветовое пространство Lab, чтобы иметь возможность сравнивать их так, как их видят люди. В противном случае вы получите цвета RGB, которые «совпадают» очень странными способами.
Ссылка на Википедию о цветовых различиях дает вам представление о различных алгоритмах разницы в цветовом пространстве Lab, которые были определены на протяжении многих лет. Самое простое, которое просто проверяет евклидово расстояние двух лабораторных цветов, работает, но имеет несколько недостатков.
Удобно, что в проекте OpenIMAJ реализована Java-реализация более сложного алгоритма CIEDE2000 . Предоставьте ему два набора цветов Lab, и он вернет вам единичное значение расстояния.
источник
Единственный «правильный» способ сравнения цветов - это делать с deltaE в CIELab или CIELuv.
Но для многих приложений я думаю, что это достаточно хорошее приближение:
distance = 3 * |dR| + 4 * |dG| + 3 * |dB|
Я думаю, что взвешенное расстояние в Манхэттене имеет гораздо больше смысла при сравнении цветов. Помните, что цветовые праймериз есть только у нас в голове. Они не имеют никакого физического значения. CIELab и CIELuv моделируются статистически исходя из нашего восприятия цвета.
источник
Для быстрого и грязного, вы можете сделать
использование целочисленного деления для квантования цветов.
источник
Swift 5 Ответ
Я нашел эту тему, потому что мне нужна была версия Swift этого вопроса. Поскольку никто не ответил решением, вот мое:
Использование:
Я установил разницу менее 10%, чтобы вернуть похожие цвета, но вы можете настроить это самостоятельно.
источник
Android для ColorUtils API RGBToHSL: у меня было два цвета int argb (color1, color2), и я хотел получить расстояние / разницу между двумя цветами. Вот что я сделал;
Затем я использовал приведенный ниже код, чтобы найти расстояние между двумя цветами.
источник