Мизантроп в тюрьме

Тема в разделе "WASM.A&O", создана пользователем _qwe8013, 26 сен 2018.

  1. _qwe8013

    _qwe8013 Active Member

    Публикаций:
    2
    Регистрация:
    30 ноя 2016
    Сообщения:
    125
    Возникла у меня тут задача: есть конечный набор цветов в 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 возможен, но является ужасным решением, может есть решение получше?
     
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Что-то мне подсказывает, что максимально удаленной точкой от одного цвета всегда будет одна из вершин этого куба. Просто взять вершину, сумма расстояний до которой от каждого цвета будет максимальной, не вариант?
     
  3. _qwe8013

    _qwe8013 Active Member

    Публикаций:
    2
    Регистрация:
    30 ноя 2016
    Сообщения:
    125
    Это если от одного, а если их больше?
    Если исходные точки расположены близко к вершинам, то возможна ситуация, при которой максимально удалённая от них точка будет ближе к центру.

    PS
    Расстояние от точки до множества у меня определено так:
    И вопрос в общем-то в том, как быть с точками, которые не попадают в диапозон RGB.
     
  4. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Согласен, сморозил фигню. Но по-моему самое тупое решение было бы самым подходящим, задача-то наверное просто контрастный цвет выбрать, а не математически точно контрастный. Можно взять не только вершины, а подробить немного кубик.

    А как они у тебя не попадут в RGB, если ты возьмешь кубик со стороной 256 единиц? Расстояние в трехмерном пространстве это теорема Пифагора дважды, можно и без LAB обойтись, что бы это ни значило.
     
  5. _qwe8013

    _qwe8013 Active Member

    Публикаций:
    2
    Регистрация:
    30 ноя 2016
    Сообщения:
    125
    У меня RGB-кубик со стороной от 0 до 1 (float), т.е. ноль соответствует нулю, а единица - двухсот пятидесяти пяти. А под непопаданием я подразумеваю, например отрицательные значения некоторых компонент при переводе в RGB.
    Мера "непохожести" двух цветов соответствует Евклидовой метрике в пространстве LAB, для этого в LAB и перевожу.
     
  6. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    https://ru.wikipedia.org/wiki/LAB
    Две наиболее широко используемые формулы цветового различия, используемые в программах обработки изображений — CIEDE1976, вычисляемая как расстояние между точками в евклидовом пространстве (квадратный корень из суммы квадратов разностей координат), и CIEDE2000, более поздний стандарт, дающая гораздо лучший результат, но в то же время чрезвычайно сложная для вычислений.
    "квадратный корень из суммы квадратов разностей координат" это пифагоровы штаны.
     
  7. _qwe8013

    _qwe8013 Active Member

    Публикаций:
    2
    Регистрация:
    30 ноя 2016
    Сообщения:
    125
    Ну, так это и относится к LAB, а не к RGB.
     
  8. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Похоже на то.Тяжело быть нубом. Значит такие точки снаружи кубика и к ним проведены линии от каждого цвета. Точка пересечения этой линии и стороны куба у каждого цвета будет своя. Можно заменить отрицательные значения на нули, а значения большие, чем 256 на 256. Тогда точка окажется на стороне и будет примерно соответствовать выбранному цвету.
     
  9. _qwe8013

    _qwe8013 Active Member

    Публикаций:
    2
    Регистрация:
    30 ноя 2016
    Сообщения:
    125
    Да, так можно сделать, но всё же интересно было бы решить задачу до конца.