IT/C#

[C#] 스펙트럼 데이터 삼자극치(XYZ) 계산하기. 색좌표(CIE1931 x, y) 계산하기. C# 구현 예제.

Ella.J 2025. 8. 25. 10:08
728x90
반응형

 

삼자극치(XYZ) 계산 함수 만들기

이번 포스팅에서는 380nm ~ 780nm 구간의 스펙트럼 데이터

**CIE 등색함수(Color Matching Functions, CMF)**를 이용해

**삼자극치(X, Y, Z)**를 계산하는 방법을 정리해보겠습니다.

조명이나 물체의 색을 다룰 때, 스펙트럼 데이터만으로는

사람이 인지하는 색을 바로 알 수 없습니다.
그래서 CIE 1931 XYZ 표색계가 도입되었고,

이를 통해 **삼자극치(Tristimulus Values)**를 구할 수 있습니다.

 


1. 삼자극치(XYZ) 정의

삼자극치는 다음과 같은 적분식으로 정의됩니다.

 

보통 k는 Y 값이 100이 되도록 맞추기도 하지만,

단순 계산에서는 k=1로 두어도 무방합니다.


2. C# 구현 예제

아래는 **1nm 간격(380~780nm)**에서

스펙트럼과 등색함수가 주어졌다고 가정한 C# 함수 예제입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
 
public class ColorCalculator
{
    // 삼자극치 계산 함수
    public static (double X, double Y, double Z) CalculateXYZ(
        double[] spectrum, double[] xBar, double[] yBar, double[] zBar)
    {
        if (spectrum.Length != xBar.Length ||
            xBar.Length != yBar.Length ||
            yBar.Length != zBar.Length)
        {
            throw new ArgumentException("데이터 배열 길이가 일치해야 합니다.");
        }
 
        double X = 0, Y = 0, Z = 0;
        double deltaLambda = 1.0// nm 간격
 
        for (int i = 0; i < spectrum.Length; i++)
        {
            X += spectrum[i] * xBar[i] * deltaLambda;
            Y += spectrum[i] * yBar[i] * deltaLambda;
            Z += spectrum[i] * zBar[i] * deltaLambda;
        }
 
        return (X, Y, Z);
    }
}
cs

 


3. 사용 예시

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Program
{
    static void Main()
    {
        // 가상의 데이터 (실제는 CIE 1931 2° observer 값 사용)
        double[] spectrum = new double[401]; // 380~780nm
        double[] xBar = new double[401];
        double[] yBar = new double[401];
        double[] zBar = new double[401];
 
        // 예시: 단순히 특정 파장대에만 빛이 있다고 가정
        spectrum[100= 1.0// 480nm 근처
        xBar[100= 0.2;
        yBar[100= 0.5;
        zBar[100= 0.3;
 
        var (X, Y, Z) = ColorCalculator.CalculateXYZ(spectrum, xBar, yBar, zBar);
 
        Console.WriteLine($"X = {X}, Y = {Y}, Z = {Z}");
    }
}
cs

 

출력 예시 : 

X = 0.2, Y = 0.5, Z = 0.3

 


4. 마무리

 

이번 포스팅에서는 스펙트럼 데이터와 CIE 등색함수를 활용해 삼자극치(XYZ)를 계산하는 함수를 C#으로 구현해 보았습니다.

실제로는 CIE가 제공하는 표준 데이터(380~780nm, 1nm 간격)를 불러와서 계산하면 정확한 결과를 얻을 수 있습니다.

 


 

추가로, 삼자극치(XYZ)를 이용하여

**색좌표(CIE1931 x, y)**를 구하는 식은 다음과 같습니다.

 

여기서 분모는 전체 빛의 밝기 합이라고 볼 수 있고,

x, y는 색상의 위치를 2차원 색도도(Chromaticity Diagram) 상에 표시할 수 있게 해줍니다.

 

 

728x90
반응형