2014-11-23 1 views
3

이다 내가 랩 색상 공간 -컬러 그라디언트 알고리즘

컬러 1 가지 색상을 생각한 = -14, b = 3

그들 사이에 n 색을 생성하고 싶습니다. n = 100 또는 그들 사이에 가능한 많은 색상을 말하십시오.

RGB 및 HSV 색상 그라디언트 알고리즘을 알고 있습니다. 하지만 LAB 색상 공간에서 그래디언트를 생성하고 싶습니다. 다른 색상 모델은 다른 그라디언트를 생성하므로 HSV 또는 RGB로 색상을 변환하고 싶지 않습니다. http://davidjohnstone.net/pages/lch-lab-colour-gradient-picker

나는 자바에서 비슷한 일을하는 것을 목표로하고있어하지만 언어는 중요하지 않습니다 난 그냥 논리를 이해할 필요하고, :

이 연구소의 그라데이션과 다른 색상 모델을 생성 내가 볼 수있는 링크입니다 알고리즘.

저는 기본적으로 스캔 한 색상 값을 5 가지 색상 차트와 대조하기 위해이 작업을 수행하고 있습니다. 그래서, 먼저 그 5 색 (그라데이션 사용) 사이에 모든 색을 생성하고 다른 색과 비교하여 가장 가까운 색을 찾아야합니다. CIEDE2000 Delta-e 방법을 사용하고 있습니다. 하지만 그것은 부차적 인 생각입니다. 내 질문의 마지막 부분에 더 추가


,

은 내가 차트의 순서로 내 샘플에서 색상의 정확한 위치를 찾으려면 때문에이 그라데이션을 생성해야합니다 가정 나는 가지고있다. EG-들어

I는 각 I 지금 (그들의 LAB 값)와 아래와 같은 0 내지 450 mg의 사이의 특정 숫자 데이터

Color 1: 78, -10, -71 [0 mg] 
Color 2: 73,-14,44 [30 mg] 
Color 3: 71, -19, 53 [80 mg] 
Color 4: 67, -18, 31 [160 mg] 
Color 5: 69, -2, 29 [300 mg] 
Color 6: 61, -14, 3 [450 mg] 

대응 내 차트에서 녹색 색조의 6 색 (검은 빛)를 가지고 그 사이에 모든 색상을 생성하고 스캔 한 색상의 위치를 ​​찾고 mg 값을 반환하려고합니다. 내 색상이 색상 1과 색상 2 사이에 정확히 있다고하면 15mg을 반환하고 그렇지 않으면 색상 2에 가까워지면 28.5mg을 반환합니다.

희망을 달성하기 위해 노력하고 있습니다.

+0

그래서, 당신은 직선 세그먼트의 끝점)에 의해 정의 된 구간 별 선형 색 그라데이션을 (가지고 있고,이 그라디언트 곳을 찾으려면 스캔 한 색상이 대략 떨어지 잖아요, 그렇죠? –

+0

예. 내가 가지고있는 기존의 6 가지 색상 사이에 추가 색상을 생성하고 그레디언트에서 스캔 한 색상의 대략적인 위치를 찾고 그에 따라 mg 값을 반환하고 싶습니다. –

답변

2

두 색상 값 사이에 그라데이션을 생성하려면 두 색상 값 사이에 단지 linearly interpolate 수 있습니다. 두 색 공간 사이의 변환이 선형이 아닌 경우 한 공간에서 선형으로 보간하여 얻은 그래디언트가 다른 공간에서 선형이 아닐지라도이 작업은 기본적으로 색 공간에서 작동합니다. 따라서 Lab 색 공간에서 그라디언트를 생성하는 것은 RGB 공간에서 그라디언트를 생성하는 것과 같습니다.

(HSV 또는 HSL과 같은 색상 공간에서 색조 좌표가 "반복됩니다"인 경우에는 보간 할 올바른 방향을 선택하는 데 약간의주의가 필요할 수 있습니다. 다행히도 여기 색상 공간에 대해서는 묻지 않습니다. , 그래서 나는 그런 세부 사항에 들어갈 필요가 없다.그냥 데모 등)


, 여기 당신이 색상 C1C2 (각 속성 L, abLabColor 객체로 주어진 사이의 N -sample 그라데이션을 생성하는 것입니다 방법)이 제 1 색이 N 컬러 샘플과 구배를 반환

public static LabColor[] makeGradient(LabColor c1, LabColor c2, int n) { 
    LabColor gradient = new LabColor[n]; 
    for (int i = 0; i < n; i++) { 
     float alpha = (float)i/(n-1); // 0.0 <= alpha <= 1.0 
     float L = (1-alpha) * c1.L + alpha * c2.L; 
     float a = (1-alpha) * c1.a + alpha * c2.a; 
     float b = (1-alpha) * c1.b + alpha * c2.b; 
     gradient[i] = new LabColor(L, a, b); 
    } 
    return gradient; 
} 

c1과 같고, 마지막 색은 c2과 같으며, 나머지는 이들 사이에서 보간됩니다.


그러나, 질문의 끝에있는 발언을 기반으로, 나는 당신이 실제로 필요 어떤 그라디언트를 생성하지 않는 생각한다. 오히려 샘플의 색상과 가장 일치하는 차트의 색상을 찾으려면 샘플에서 각 차트 색상의 perceptual distance을 계산하면됩니다 (Lab 색상 공간에서 유클리드 스타일러스로 간단히 근사시킬 수 있음). 거리) 선택에 가장 가까운 하나 : 바로 당신을 이해한다면

public static LabColor findNearest(LabColor sample, LabColor[] chart) { 
    LabColor nearest = null; 
    float minDistanceSquared = Float.POSITIVE_INFINITY; 
    for (int i = 0; i < chart.length; i++) { 
     float dL = sample.L - chart[i].L; 
     float da = sample.a - chart[i].a; 
     float db = sample.b - chart[i].b; 
     float distanceSquared = dL*dL + da*da + db*db; 
     if (distanceSquared < minDistanceSquared) { 
      nearest = chart[i]; 
      minDistanceSquared = distanceSquared; 
     } 
    } 
    return nearest; 
} 
+0

정확하게 달성하기 위해 노력하고있는 것을 명확히하기 위해 제 질문을 업데이트했습니다. –