Как определить, является ли цвет воображаемым/невозможным?

Укороченная версия

Как узнать, является ли цвет (например, XYZ) невозможным? (Википедия: невозможный цвет)

Например, такой цвет невозможен:

  • XYZ: (15,96, 84,04, 0)
  • xyY: (0,1595, 0,8404, 0,8404)
  • Лаборатория: (93, -196, 161) (точка белого D65)

Это невозможно, потому что оно лежит за пределами диаграммы цветности:

введите здесь описание изображения

Как я могу узнать это?

неверный код

Цель состоит в том, чтобы кто-то заполнил функцию:

Boolean IsImaginaryColor(Single X, Single Y, Single Z)
{
   //...TODO: Get someone to answer the question.
}

Сейчас мы знаем, что если какой-либо из компонентов соответствующего цвета LMS отрицательный, то этот цвет воображаемый.

Это необходимое, но недостаточное условие для того, чтобы цвет был реальным. Вы можете иметь все три компонента LMS положительными, но это все равно будет воображаемый цвет.

Boolean IsImaginaryColor(Single X, Single Y, Single Z)
{
   //If any component of LMS color is negative, 
   //then the color is definitely imaginary.
   LMSColor lms = XYZtoLMS(X, Y, Z);
   if ((lms.L < 0) or (lms.M < 0) or (lms.S < 0))
      return true;

   //The color may still be imaginary, 
   //but i don't know how to solve that problem
   //So as a first approximation i'll say it's real
   return false; 
}

LMSColor XYZtoLMS(Single X, Single Y, Single Z)
{
   //perform Matrix multiplication:
   //
   // LMS = M * XYZ
   //
   // Where M is the M_CAT02 transformation matrix from CIECAM02
   //
   //    0.7328, 0.4296, -0.1624
   //   -0.7036, 1.6975,  0.0061
   //    0.0030, 0.0136,  0.9834

   LMSColor result;

   result.L =  0.7328*X + 0.4296*Y + -0.1624*Z
   result.M = -0.7036*X + 1.6975*Y +  0.0061*Z
   result.S =  0.0030*X + 0.0136*Y +  0.9834*Z
}

В цветовой плоскости xy это дает хорошее первое приближение (и хорошую визуальную индикацию) невозможных цветов:

введите здесь описание изображения

Но вычисление по-прежнему дает цвета за пределами диаграммы цветности * (технически они находятся за пределами «спектрального локуса»). Таким образом, очевидно, что только проверка отрицательных компонентов в LMS является неполной.

Длинная версия

Я делаю палитру цветов. Например:

  • чтобы выбрать цвет Lab
  • вы выбираете цвет ab
  • для заданной плоскости L

Это похоже на то, что вы уже можете сделать в Photoshop:

введите здесь описание изображения

Итак, в этом случае я выбрал цвет:

  • Лаборатория: (72, -58, 119)

Этот цвет (при условии, что точка белого D65) соответствует цвету XYZ:

  • Лаборатория: (72, -58, 119)
  • XYZ: (25,22, 43,66, 0,36)

Вы можете сказать, находится ли реальный цвет за пределами цветовой гаммы sRGB, если один из его компонентов:

  • меньше 0
  • больше 255

Этот цвет XYZ находится за пределами цветового пространства sRGB, поскольку один из его компонентов отрицательный:

  • XYZ: (25,22, 43,66, 0,36)
  • Лаборатория: (72, -58, 119) (D65)
  • RGB: (106.1, 199.6, -234.7) (sRGB)

Photoshop уже знает, находится ли цвет за пределами цветовой гаммы sRGB, и отобразит предупреждение gumut:

введите здесь описание изображения

Но я хотел бы сделать еще один шаг вперед

Я уже могу знать, находится ли цвет за пределами цветовой гаммы sRGB.

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

введите здесь описание изображения

Предупреждение: я понятия не имею, какие из этих цветов на самом деле невозможны. Это только идея концепции.

Итак, мне нужно знать, является ли цвет невозможным.

Теория фона. Какой пример невозможного цвета?

На странице Википедии, посвященной Невозможным цветам, отмечается, что хотя все основные цвета для цветового пространства sRGB лежат внутри спектрального локуса, то есть все реальные цвета:

введите здесь описание изображения

Цветовое пространство ProPhotoRGB использует некоторые основные цвета, которые невозможны:

введите здесь описание изображения

цветовое пространство ProPhoto RGB использует воображаемые основные цвета зеленого и синего для получения более широкой гаммы (пространство внутри цветового пространства). треугольник), чем это было бы возможно с тремя реальными основными цветами. Однако некоторые настоящие цвета по-прежнему невозможно воспроизвести.

Итак, теперь у меня есть конкретный пример невозможного цвета: основной цвет зеленый цветового пространства ProPhoto RGB:

| Color | CIE x  | CIE y  |
|-------|--------|--------|
| red   | 0.7347 | 0.2653 |
| green | 0.1596 | 0.8404 | <--- this one
| blue  | 0.0366 | 0.0001 |
| white | 0.3457 | 0.3585 |

введите здесь описание изображения

Этот невозможный цвет, учитывая разные цветовые пространства:

  • xyY: (0,1596, 0,8404, 0,8404)
  • XYZ: (15,96, 84,04, 0)
  • LMS: (47,80, 131,43, 1,19)
  • Лаборатория: (93.4679, -195.9973, 161.1515)
  • LCHab: (93,4679, 253,7415, 140,5725)

Как я могу сказать, что этот цвет невозможен?

Учитывая цвет XYZ, как я могу сказать, что это невозможно? Например.:

  • XYZ: 15.96, 84.04, 0

Бонусная болтовня

Важно отметить разницу между

  • цвета, существующие за пределами некоторой гаммы
  • и воображаемые цвета

Быстрый пример для одного изображения:

введите здесь описание изображения

  • Gamut: цвет может не отображаться на вашем мониторе, принтере или телефоне, но он все равно является реальным цветом — вы можете получить комбинацию электромагнитных волн различной длины волны и интенсивности для создания цвета.
  • Воображаемый: никакая комбинация электромагнитных волн любой интенсивности, любой длины волны не может генерировать такой отклик в длиннойдлинной, среднейсреде и Sкороткие человеческие шишки

Я уже знаю, как определить, существует ли цвет за пределами определенной цветовой гаммы.

Я хочу знать, существует ли цвет за пределами спектрального локуса.

Другими словами: я хочу знать, является ли это воображаемым.

Брюс Линдблум имеет красивую графику, которая поднимает вопросы цветов за пределами лаборатории. пробел, когда вы произвольно выбираете произвольное ограничение значений компонентов a и b до +- 128:

введите здесь описание изображения

Бонусное чтение


person Ian Boyd    schedule 02.08.2018    source источник


Ответы (1)


Это дубликат ответа, который я дал здесь: Определите, что цвет Luv не является воображаемым, которые относятся к https://stackoverflow.com/a/48396021/931625

Я думаю, что безопасный способ - вычислить границы объема XYZ и проверить, находитесь ли вы внутри или снаружи.

person Kel Solaar    schedule 03.08.2018
comment
Очевидно, я знал ваш ответ, так как я связал его в вопросе и на странице Брюса. Проблема в том, что ни один из них не объясняет, как решить вопрос. Там говорят об использовании спектральных импульсов, не упоминая, что такое спектральные импульсы, что такое матрицы, для чего они используются, что они делают или как они помогают решить вопрос. Насколько я понимаю, они не отвечают на вопрос, а являются необходимым первым шагом в безымянном многоэтапном процессе, который решает вопрос. Мне нужны оставшиеся 3 шага. Или, в идеале, Boolean IsImaginary(Single X, Single Y, Single Z) { ... }; - person Ian Boyd; 04.08.2018
comment
Извините, я только что увидел ссылки. Приведенный выше ответ дает вам код Python, который при запуске скажет вам, что вы просили. Реальность такова, что то, о чем вы просите, слишком сложно, чтобы поместиться в одну функцию, о которой вы могли догадаться, читая мой ответ, объясняющий процесс: stackoverflow.com/a/48396021/931625 Вы, наверное, видели, что существует дюжина вызовов различных функций Numpy и Color для вычисления границ. Для этого требуется не только значительный объем кода, выходящий далеко за рамки одной функции, но и хорошее понимание науки о цвете. - person Kel Solaar; 05.08.2018