Лучший алгоритм для согласования цветов.

У меня есть массив из 200 цветов в формате RGB. Я хочу написать программу, которая принимает любой цвет RGB и пытается сопоставить цвет из массива, который наиболее "похож".

Мне нужно хорошее определение для "похожего", которое как можно ближе к восприятию человека.

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

Нужно ли использовать нейронные сети? Есть ли более простая альтернатива?

Ответ 1

Преобразуйте все цвета в цветовое пространство CIE Lab и вычислите расстояние в этом пространстве

deltaE = sqrt(deltaL^2 + deltaA^2 + deltaB^2)

Цвета с наименьшей deltaE наиболее восприимчивы друг к другу.

Ответ 2

Нет, вам здесь не нужны нейронные сети! Просто рассмотрите значение цвета HSL вектора и определите функцию взвешенного модуля для вектора, как это:

modulus = sqrt(a*H1*H1 + b*S1*S1 + c*L1*L1);

where a,b,c are weights you should decide based on your visual definition of what
creates a bigger difference in perceived color - a 1% change in Hue or a 1%
change in Saturation

Я предлагаю вам использовать a = b = 0.5 и c = 1

Наконец, узнайте диапазон, который примет ваш модуль, и определите похожие цвета, которые будут иметь свои модули очень близко друг к другу (скажем, 5%)

Ответ 3

Я также указал бы на метод метод наименьших квадратов, как нечто немного более простое. То есть, вы принимаете разницу в количестве, квадрате, затем суммируете все эти квадратичные различия.