Heim >Backend-Entwicklung >C++ >Wie kann ich RGB effizient in HSV und umgekehrt im Bereich von 0 bis 255 konvertieren?

Wie kann ich RGB effizient in HSV und umgekehrt im Bereich von 0 bis 255 konvertieren?

Susan Sarandon
Susan SarandonOriginal
2025-01-01 02:06:09797Durchsuche

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

Konvertieren von RGB in HSV und umgekehrt im Bereich 0-255: Praktische Codelösungen

Problem:

In Bei verschiedenen Bildverarbeitungsanwendungen ist es häufig erforderlich, Farben zwischen den RGB- und HSV-Farbräumen zu konvertieren. Um nahtlose Übergänge zu gewährleisten, ist es wichtig, für beide Räume im gleichen Bereich zu arbeiten, typischerweise zwischen 0 und 255.

Lösung:

Um dieser Anforderung gerecht zu werden, lassen Sie uns dies untersuchen Bewährte Algorithmen, die Farben innerhalb des angegebenen Bereichs effizient zwischen RGB und HSV konvertieren:

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;     
}

Das obige ist der detaillierte Inhalt vonWie kann ich RGB effizient in HSV und umgekehrt im Bereich von 0 bis 255 konvertieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn