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
반응형
'IT > C#' 카테고리의 다른 글
[C#] WinForms Button 혹은 다른 Control에 세로 텍스트 적용하기. (1) | 2025.08.25 |
---|---|
[C#] OpenCvSharp4 사용하여 이미지 발광영역 Rectangle 검출하기 (0) | 2025.08.25 |
[C#] Excel Workbook XML 파일 형식으로 저장하기 (Workbook.SaveAs) (37) | 2024.12.05 |
[C#] DataGridView 자동 줄바꿈 기능 & 행 높이 자동 변환 (WrapMode & AutoSizeRowsMode) (0) | 2024.12.04 |
[C#] 실시간 시계 라벨 만들기. Timer 사용법. (2) | 2024.11.21 |