"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 색상 배열에서 가장 가까운 색상을 찾는 방법은 무엇입니까?

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

2025-03-23에 게시되었습니다
검색:547

How to Find the Closest Color in a Color Array?

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

배열에서 가장 가까운 일치를 식별하는 것은 그래픽 애플리케이션에서 일반적인 작업입니다. 이 기사에서는 다음을 수행하기위한 세 가지 다른 방법을 살펴볼 것입니다 :

거리 메트릭

1. 색조 전용 비교 :

이 메소드는 채도와 밝기를 무시하고 색상의 색상 만 고려합니다. 색조 거리는 간단한 뺄셈을 사용하여 계산되며 가장 가까운 색조는 최소 거리를 찾아 결정됩니다.

2. RGB 거리 :

이 메소드는 색상의 RGB 값 사이의 직접 거리를 측정합니다. 색상 차이는 RGB 공간에서 유클리드 거리로 계산되며,이 차이를 최소화함으로써 가장 가까운 색상이 발견됩니다.

3. 가중 색조, 채도 및 밝기 비교 :

이 방법은 가중 방식으로 색조, 채도 및 밝기를 결합합니다. 인지 된 밝기가 계산되고 색상 번호는 채도와 밝기에 따라 계산됩니다. 가장 가까운 색상은 색상 차이와 색조 거리의 가중 합계를 최소화함으로써 결정됩니다.

구현

다음은 다음과 같습니다. int closestColor1 (목록 색상, 색상 대상) { 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 거리 비교 int closestColor2 (목록 색상, 색상 대상) { var colordiffs = colors.select (n => colordiff (n, target)). min (n => n); return colors.findIndex (n => colordiff (n, target) == colordiffs); } // 가중 색조, 채도 및 밝기 비교 int closestColor3 (목록 색상, 색상 대상) { 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); }
// Hue-Only Comparison
int closestColor1(List 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 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 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);
}
헬퍼 함수

// 인식 된 색상 밝기 : float getBrightness (color c) => (c.r * 0.299f C.g * 0.587f C.B * 0.114f) / 256f; // 두 색조 사이의 거리 : float gethuedistance (float hue1, float hue2) => math.abs (hue1 -hue2)> 180? 360 -Math.abs (Hue1 -Hue2) : Math.abs (hue1 -hue2); // 채도와 밝기로 무게를 측정합니다. float colornum (color c) => c.getSaturation () * 요소 getBrightness (c) * factorbri; // RGB 공간의 거리 : int colordiff (컬러 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);
// Hue-Only Comparison
int closestColor1(List 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 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 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);
}

메트릭은 특정 응용 프로그램에 따라 다릅니다. HUE가 주요 고려 사항이라면 Hue 전용 비교로 충분합니다. 보다 일반적인 색상 일치의 경우 RGB 거리 또는 가중 색조, 채도 및 밝기 비교 방법이보다 정확한 결과를 제공합니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3