Возникла у меня тут задача: есть конечный набор цветов в RGB формате (каждая компонента от 0 до 1) нужно сгенерировать такой новый цвет, который будет максимально не похож на цвета в данном наборе. На сколько я понял, "непохожесть" цветов определяется евклидовым расстоянием в цветовом пространстве LAB. Т.о. можно перевести данные цвета в LAB, найти новый цвет, и его перевести обратно в RGB. Так и сделаем, и получим прямоугольный параллелипипед, внутри которого есть точки, и надо найти максимально удалённую от них точку, которая бы принадлежала этому параллелипипеду (расстояние от точки до множества - это минимум расстояний от данной точки до точек данного множества). Решить данную задачу можно следующим образом: каждая имеющаяся в изначальном наборе (уже переведённая в LAB) точка имеет 3 координаты (L, A, B). Рассмотрим только координату L. Тут у нас получится отрезок от 0 до 100, на котором отмечены некоторые точки (в принципе некоторые из них могут совпадать, но это не важно). Найдём на данном отрезке две соседние точки из данного набора, между которыми было бы максимальное расстояние (вообще, данная задача может иметь несколько решений, так что выберем одно из них) и выберем точку по центру между двумя найденными. Теперь сравним расстояние от выбранной точки до имеющегося множества точек с расстояниями от концов отрезка и из получившихся 3-х вариантов выберем тот, который максимально удалён от данного множества, это и будет L-координатой искомой точки в пространстве LAB. С координатами A и B поступаем аналогично, и теперь у нас есть максимально удалённая от данного множества точка. Но тут возникает проблема: LAB - более "широкое" пространство чем RGB, и некоторые точки из LAB при переводе в RGB получают некорректные координаты, а нужен результат в RGB. Тупой перебор всех точек в RGB возможен, но является ужасным решением, может есть решение получше?
Что-то мне подсказывает, что максимально удаленной точкой от одного цвета всегда будет одна из вершин этого куба. Просто взять вершину, сумма расстояний до которой от каждого цвета будет максимальной, не вариант?
Это если от одного, а если их больше? Если исходные точки расположены близко к вершинам, то возможна ситуация, при которой максимально удалённая от них точка будет ближе к центру. PS Расстояние от точки до множества у меня определено так: И вопрос в общем-то в том, как быть с точками, которые не попадают в диапозон RGB.
Согласен, сморозил фигню. Но по-моему самое тупое решение было бы самым подходящим, задача-то наверное просто контрастный цвет выбрать, а не математически точно контрастный. Можно взять не только вершины, а подробить немного кубик. А как они у тебя не попадут в RGB, если ты возьмешь кубик со стороной 256 единиц? Расстояние в трехмерном пространстве это теорема Пифагора дважды, можно и без LAB обойтись, что бы это ни значило.
У меня RGB-кубик со стороной от 0 до 1 (float), т.е. ноль соответствует нулю, а единица - двухсот пятидесяти пяти. А под непопаданием я подразумеваю, например отрицательные значения некоторых компонент при переводе в RGB. Мера "непохожести" двух цветов соответствует Евклидовой метрике в пространстве LAB, для этого в LAB и перевожу.
https://ru.wikipedia.org/wiki/LAB Две наиболее широко используемые формулы цветового различия, используемые в программах обработки изображений — CIEDE1976, вычисляемая как расстояние между точками в евклидовом пространстве (квадратный корень из суммы квадратов разностей координат), и CIEDE2000, более поздний стандарт, дающая гораздо лучший результат, но в то же время чрезвычайно сложная для вычислений. "квадратный корень из суммы квадратов разностей координат" это пифагоровы штаны.
Похоже на то.Тяжело быть нубом. Значит такие точки снаружи кубика и к ним проведены линии от каждого цвета. Точка пересечения этой линии и стороны куба у каждого цвета будет своя. Можно заменить отрицательные значения на нули, а значения большие, чем 256 на 256. Тогда точка окажется на стороне и будет примерно соответствовать выбранному цвету.