Укороченная версия
Как узнать, является ли цвет (например, 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: