> 백엔드 개발 > C++ > 0-255 범위 내에서 RGB를 HSV로 또는 그 반대로 효율적으로 변환하려면 어떻게 해야 합니까?

0-255 범위 내에서 RGB를 HSV로 또는 그 반대로 효율적으로 변환하려면 어떻게 해야 합니까?

Susan Sarandon
풀어 주다: 2025-01-01 02:06:09
원래의
779명이 탐색했습니다.

How can I efficiently convert RGB to HSV and vice versa within the 0-255 range?

0-255 범위에서 RGB를 HSV로 변환하고 그 반대로 변환: 실용적인 코드 솔루션

문제:

In 다양한 이미지 처리 응용 프로그램에서는 RGB와 HSV 색상 공간 간에 색상을 변환해야 하는 경우가 많습니다. 원활한 전환을 보장하려면 두 공간에 대해 동일한 범위(일반적으로 0~255) 내에서 작업하는 것이 중요합니다.

해결책:

이 요구 사항을 해결하려면 다음을 살펴보겠습니다. 지정된 범위 내에서 RGB와 HSV 간 색상을 효율적으로 변환하는 검증된 알고리즘 범위:

typedef struct {
    double r;
    double g;
    double b;
} rgb;

typedef struct {
    double h;
    double s;
    double v;
} hsv;
로그인 후 복사
hsv rgb2hsv(rgb in)
{
    hsv         out;
    double      min, max, delta;

    min = in.r < in.g ? in.r : in.g;
    min = min  < in.b ? min  : in.b;

    max = in.r > in.g ? in.r : in.g;
    max = max  > in.b ? max  : in.b;

    out.v = max;
    delta = max - min;
    if (delta < 0.00001)
    {
        out.s = 0;
        out.h = 0; // undefined, maybe nan?
        return out;
    }
    if( max > 0.0 ) { // NOTE: if Max is == 0, this divide would cause a crash
        out.s = (delta / max);
    } else {
        // if max is 0, then r = g = b = 0              
        // s = 0, h is undefined
        out.s = 0.0;
        out.h = NAN;
        return out;
    }
    if( in.r >= max ) // > is bogus, just keeps compilor happy
        out.h = ( in.g - in.b ) / delta;        // between yellow & magenta
    else
    if( in.g >= max )
        out.h = 2.0 + ( in.b - in.r ) / delta;  // between cyan & yellow
    else
        out.h = 4.0 + ( in.r - in.g ) / delta;  // between magenta & cyan

    out.h *= 60.0;

    if( out.h < 0.0 )
        out.h += 360.0;

    return out;
}
로그인 후 복사
rgb hsv2rgb(hsv in)
{
    double      hh, p, q, t, ff;
    long        i;
    rgb         out;

    if(in.s <= 0.0) {
        out.r = in.v;
        out.g = in.v;
        out.b = in.v;
        return out;
    }
    hh = in.h;
    if(hh >= 360.0) hh = 0.0;
    hh /= 60.0;
    i = (long)hh;
    ff = hh - i;
    p = in.v * (1.0 - in.s);
    q = in.v * (1.0 - (in.s * ff));
    t = in.v * (1.0 - (in.s * (1.0 - ff)));

    switch(i) {
    case 0:
        out.r = in.v;
        out.g = t;
        out.b = p;
        break;
    case 1:
        out.r = q;
        out.g = in.v;
        out.b = p;
        break;
    case 2:
        out.r = p;
        out.g = in.v;
        out.b = t;
        break;

    case 3:
        out.r = p;
        out.g = q;
        out.b = in.v;
        break;
    case 4:
        out.r = t;
        out.g = p;
        out.b = in.v;
        break;
    case 5:
    default:
        out.r = in.v;
        out.g = p;
        out.b = q;
        break;
    }
    return out;     
}
로그인 후 복사

위 내용은 0-255 범위 내에서 RGB를 HSV로 또는 그 반대로 효율적으로 변환하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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