2015-08-06 2 views
1

Я пытаюсь преобразовать RGB цвета CIE-XYZ и в конечном счете хотел бы преобразовать их в CIElab однако я испытывающие проблемы с java.awt.color.ColorSpace.CS_CIEXYZ Цветовое пространство.RGB для CIE-XYZ в Java

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

Код:

import java.awt.color.ColorSpace; 
import java.util.Arrays; 

public class CIEXYZ { 

    private final static float[] RGB = new float[] {255.0f, 255.0f, 255.0f}; 
    private final static ColorSpace CIEXYZ = ColorSpace.getInstance(ColorSpace.CS_CIEXYZ); 

    public static void main(String[] args) { 
     System.out.println("RGB: " + Arrays.toString(RGB)); 
     System.out.println("CIEXYZ: " + Arrays.toString(CIEXYZ.fromRGB(RGB))); 
    } 
} 

Выход:

RGB: [255,0, 255,0, 255,0]

CIEXYZ: [0.95254517, 0.98773193, 0.81500244]

калькулятор онлайн:

http://www.easyrgb.com/index.php?X=CALC

XYZ = 95,050 100,000 108,900

Есть ли что-то я с видом или делаю не так?

+1

Я думал, что диапазон поплавка должен быть 0.0f .. 1.0f. Для ints 0 .. 255. –

+0

Так что я просто должен был бы разделить их на 255.0f? – MicroHat11

+1

Когда программисты говорят о цветах, они склонны думать: «Ну, RGB, да? Это легко». Когда вы погрузитесь немного глубже в эту тему, вы столкнетесь с результатами 50-летнего исследования колориметрии (и странного числа стандартов и деталей). Например. на веб-сайте калькулятора белая точка - «Дневной свет», что бы это ни значило. В [ColorSpace] (https://docs.oracle.com/javase/8/docs/api/java/awt/color/ColorSpace.html) говорится, что XYZ использует D50. Использование этого на веб-сайте приведет к тому, что какое-то значение окажется вне диапазона (Java может зажать его или просто проигнорировать это и вернуть значение) – Marco13

ответ

1

То, что вы видите, является результатом того, что класс Java хроматически адаптируется к CIE Standard Illuminant D50.

Используя Colour, здесь, например, преобразование в трехцветной значения, сохраняя при этом SRGB colourspace осветителя (МКО стандартного источника света D65):

import colour 

sRGB = np.array([255., 255., 255.]) 
sRGB /= 255. 

# Default conversion from *sRGB* colourspace 
# to *CIE XYZ* tristimulus values. 
# It should return *CIE Standard Illuminant D65* 
# tristimulus values using the above array. 
print(colour.sRGB_to_XYZ(sRGB)) 

[0,95042854 1,08890037 1.]

и теперь такое же преобразование, но с хроматической адаптацией к CIE Standard Illuminant D50:

# Conversion to *CIE XYZ tristimulus* values but chromatically adapting 
# to *CIE Standard Illuminant D50*. 
D50 = colour.ILLUMINANTS['cie_2_1931']['D50'] 

print(colour.sRGB_to_XYZ(sRGB, D50)) 

[0,96421199 0,82518828 1.]

Обычно осветительные приборы нормированы на их Luminance именно поэтому Y равно в наших расчетах, я не исследовал, почему класс Java не возвращает нормированное значение, но быстрая проверка показывает, что его вычисление почти спот:

D50 = colour.ILLUMINANTS['cie_2_1931']['D50'] 

print(colour.sRGB_to_XYZ(sRGB, D50) * 0.98773193) 

Цвет: [0,95238297 0,98773193 0,81506482]

Java: [0,95254517 0,98773193 0.81500244]