> 백엔드 개발 > C++ > 색상 배열에서 가장 가까운 색상을 찾는 방법은 무엇입니까?

색상 배열에서 가장 가까운 색상을 찾는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-12-28 12:50:11
원래의
270명이 탐색했습니다.

How to Find the Closest Color in a Color Array?

배열에서 가장 가까운 색상 결정

색상을 비교하고 배열 내에서 가장 가까운 일치 항목을 식별하는 것은 그래픽 애플리케이션에서 일반적인 작업입니다. 이 기사에서는 이를 달성하기 위한 세 가지 방법을 살펴보겠습니다.

거리 측정법

1. 색상만 비교:

채도와 명도는 무시하고 색상의 색상만 고려하는 방법입니다. 간단한 빼기를 이용하여 색상거리를 계산하고, 최소거리를 구하여 가장 가까운 색상을 결정합니다.

2. RGB 거리:

이 방법은 색상의 RGB 값 사이의 직접적인 거리를 측정합니다. 색차는 RGB 공간에서 유클리드 거리로 계산하고, 이 차이를 최소화하여 가장 가까운 색을 찾는다.

3. 가중치가 적용된 색상, 채도 및 밝기 비교:

이 방법은 색상, 채도 및 밝기를 가중치 방식으로 결합합니다. 인지된 밝기가 계산되고 채도와 밝기를 기준으로 색상 번호가 계산됩니다. 가장 가까운 색상은 색상 차이와 색상 거리의 가중치 합을 최소화하여 결정됩니다.

구현

다음 방법의 구현은 다음과 같습니다.

// Hue-Only Comparison
int closestColor1(List<Color> colors, Color target)
{
    var hue1 = target.GetHue();
    var diffs = colors.Select(n => getHueDistance(n.GetHue(), hue1));
    var diffMin = diffs.Min(n => n);
    return diffs.ToList().FindIndex(n => n == diffMin);
}

// RGB Distance Comparison
int closestColor2(List<Color> colors, Color target)
{
    var colorDiffs = colors.Select(n => ColorDiff(n, target)).Min(n => n);
    return colors.FindIndex(n => ColorDiff(n, target) == colorDiffs);
}

// Weighted Hue, Saturation, and Brightness Comparison
int closestColor3(List<Color> colors, Color target)
{
    float hue1 = target.GetHue();
    var num1 = ColorNum(target);
    var diffs = colors.Select(n => Math.Abs(ColorNum(n) - num1) + getHueDistance(n.GetHue(), hue1));
    var diffMin = diffs.Min(x => x);
    return diffs.ToList().FindIndex(n => n == diffMin);
}
로그인 후 복사

도우미 기능

// Color brightness as perceived:
float getBrightness(Color c) => (c.R * 0.299f + c.G * 0.587f + c.B * 0.114f) / 256f;

// Distance between two hues:
float getHueDistance(float hue1, float hue2) => Math.Abs(hue1 - hue2) > 180 ? 360 - Math.Abs(hue1 - hue2) : Math.Abs(hue1 - hue2);

// Weighed by saturation and brightness:
float ColorNum(Color c) => c.GetSaturation() * factorSat + getBrightness(c) * factorBri;

// Distance in RGB space:
int ColorDiff(Color c1, Color c2) => (int)Math.Sqrt((c1.R - c2.R) * (c1.R - c2.R) + (c1.G - c2.G) * (c1.G - c2.G) + (c1.B - c2.B) * (c1.B - c2.B));
로그인 후 복사

결론

선택 색상 거리 측정 기준은 특정 응용 프로그램에 따라 다릅니다. 색상이 주요 고려사항이라면 색상만 비교하는 것으로 충분합니다. 보다 일반적인 색상 매칭을 위해서는 RGB 거리나 가중치를 적용한 색상, 채도, 밝기 비교 방법을 사용하면 더욱 정확한 결과를 얻을 수 있습니다.

위 내용은 색상 배열에서 가장 가까운 색상을 찾는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿