선형 그라디언트를 정의하는 두 가지 색상을 평균화하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/649454

  •  19-08-2019
  •  | 
  •  

문제

RGB 값으로 정의 된 두 가지 색상이 있다면 빨간색, 녹색 및 파란색 값을 평균화 한 다음 결합하여 두 가지의 시각적 평균처럼 보이는 세 번째 색상을 정의 할 수 있습니까?

즉, NewColor = (R1+R2)/2, (G1+G2)/2, (B1+B2)/2

edit1 : 모든 응답에 감사드립니다. 현재의 요구에 대해, 나는 같은 색상의 색조 인 컬러 쌍 만 다루고 있으므로 평균화하는 것이 효과가 있다고 생각합니다. 그러나, 나는 랩 스페이스로 변환하여 가정이 사실인지 확인하고 기술이 미래에 유용 할 것입니다.

edit2 : 여기 내 결과가 있습니다. Color1과 Color2는 나의 두 가지 색상이고 두 개의 중간 열은 L에서 평균화 된 결과입니다.B 공간과 평균 RGB. 이 경우 두 색상 사이에는 많은 차이가 없으므로 평균화 기술의 출력 차이는 미묘합니다.

visual comparison of color averaging techniques

도움이 되었습니까?

해결책

답을 살펴보십시오 이 질문.

기본적으로 색상을 불리는 것으로 변환하려고합니다. 실험실 공간, 그 공간에서 평균을 찾으십시오.

실험실 공간은 서로 가까이있는 점이 인간과 비슷한 것으로 보이는 색상을 나타내는 방법입니다.

다른 팁

몇 가지 답변은 실험실 색상 공간으로 변환하는 것을 제안합니다. 이는 아마도 더 복잡한 색상 조작을위한 좋은 접근법 일 것입니다.

그러나 단순히 평균 두 가지 색상을 취하는 빠른 방법이 필요한 경우 RGB 공간에서 수행 할 수 있습니다. 당신은 단지 경고를 염두에 두어야합니다. 평균을 평균하기 전에 RGB 값을 제곱 한 다음 결과의 루트를 취해야합니다. (단순히 평균을 취하면 결과가 너무 어두워지는 경향이 있습니다.)

이와 같이:

NewColor = sqrt((R1^2+R2^2)/2),sqrt((G1^2+G2^2)/2),sqrt((B1^2+B2^2)/2)

이 방법이 효율적인 이유를 설명하는 훌륭한 vid가 있습니다. https://www.youtube.com/watch?v=lknqeccg6gw

평균화 HSL 색상 공간 더 나은 결과를 얻을 수 있습니다.

나는 구성 요소의 단순한 평균을 취하는 것이 지각적인 관점에서 "최고"인지 (심리학자에게는 질문처럼 들리지만) 간단한 구성 요소 평균을 사용하는 몇 가지 예가 있습니다.

alt text

붉은 색의 녹색은 못 생겼지 만 보간은 충분히 합리적으로 보입니다.

예. 당신은 그렇게 평균 두 가지 색상을 함께 할 수 있습니다. OpenGL이 색상을 함께 혼합하기 위해 사용하는 접근법입니다 (예 : 먼 물체를 렌더링하거나 50% 투명한 텍스처를 렌더링하기위한 MIP 맵을 작성하는 데있어). 많은 상황에서 빠르고 단순하며 "충분히"입니다. 그러나 완전히 현실적이지 않으며 아마도 사진 품질 이미지에 사용되지 않을 것입니다.

이것은 어렵다. 첫째, RGB 값 세트는 색상을 정의하지 않습니다. SRGB, Rec.709, Rec.2020, Adobe RGB (1998) 등과 같은 색상 원초 (색상 공간)에 비추어 해석해야합니다.

또한, RGB 값은 정상적으로 직면 할 때 선형 표시등에 비례하지 않습니다. 비선형 함수 (GAMMA)를 사용하여 "인코딩"됩니다. 때로는 (비디오 응용 프로그램에서) "검은 색"의 값은 0이 아니지만 0에서 오프셋됩니다. 일반적으로 8 비트 값의 경우 16입니다. "흰색"은 255가 아니라 235입니다. SRGB 및 Rec.709 공유 RGB 기본 원금이지만 감마 기능은 다릅니다.

색상 공간 변환은 검은 색 오프셋을 제거하여 검은 색이 0이되도록 시작합니다. 감마 함수에 SRGB 및 REC.709와 같은 예전에 브레이크 포인트가있는 경우 "흰색"이 1.0이되도록 RGB 값을 신중하게 스케일링해야합니다.

그런 다음 원래 감마 기능의 역전을 통해 감마를 "디코딩"합니다. (한 가지 대답은 감마 디코딩의 근사치 인 값을 제곱하는 것을 제안했습니다.) 이제 일부 색상 공간에 선형 라이트 RGB 값이 있습니다. 이 시점에서 해당 색상 공간에서 실험실 공간으로 변환 할 수 있습니다. RGB에서 실험실로 대부분의 변환은 XYZ라는 중간 색상 공간을 거칩니다.

중첩 된 기능이 호출되는 단계 :

lab = xyz2lab (rgb2xyz (gamma_decode (offset_and_scale), 감상 장애 ), RGB 색상 공간 ) )

(실험실 공간은 1976 년 표준 CIE XYZ 공간의 지각 적으로 균일 한 뒤틀림을 만들기위한 시도로 개발되었습니다. -현명하게 다른 (1 "JND")는 두 가지 색상의 거리가 동일합니다. 실험실의 두 색상 사이의 거리는 '델타 -E'라고합니다. 간단한 델타 유클리드 거리 공식은 이제 DE76이라고합니다. https://en.wikipedia.org/wiki/color_difference)

귀하의 경우, 두 실험실 색상을 평균하여 새로운 실험실 색상을 얻은 다음 모든 변환을 역전하여 선택한 색상 공간에서 RGB로 돌아갈 수 있습니다.

이것은 "색상"이 물리적 수량이 아니라 인간의 인식이기 때문에 안정적으로 특성화하기가 어렵 기 때문에 당신을 가까이하게 만들지 만 보장되지는 않습니다. 실험실은 실제로 지각 적으로 균일하는 데 잘 작동하지 않았습니다. 따라서 랩을 고치기보다는 또 다른 날실이 내장 된 새롭고 복잡한 델타 -E 기능을 제안했습니다 : DE94. 그것은 더 좋았지 만 완벽하지는 않았으므로 2000 년에 또 다른 제안이 나타났습니다 : DE2000. 또한 낫지 만 완벽하지는 않습니다. 자세한 내용은 위의 위키 페이지를 참조하십시오.

DE2000이 충분하지 않으면 (또는 너무 복잡한 경우) Lab이라는 대안을 살펴볼 수 있습니다. ICTCP 그것은 실험실보다 지각 적으로 균일하다고 주장된다.

Arntjw의 답변은 올바른 방향으로 진행되고 Dan W에서 언급 한 바와 같이 로그 언더 레이를 인식합니다. (C1*C2). 평균 색상은 다음과 같습니다.

NewColor = sqrt(R1*R2),sqrt(G1*G2),sqrt(B1*B2)

결과 색상은 우리가 기대하는 것에 더 가깝습니다. 고차 뿌리를 사용하여 더 많은 색상으로 일반화하고 구성 요소에 지수를 추가하여 각 색상의 무게를 가중시킬 수 있습니다.

실제로 훨씬 간단한 방법이 있습니다.

  • 이미지를 1px로 1px로 스케일링하십시오.

    1px의 색상은 스케일링 한 평균 색상입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top