Program to Change RGB color model to HSV color model (original) (raw)

Last Updated : 20 Feb, 2023

Given RGB color range, our task is to convert RGB color to HSV color.
RGB Color Model :
The RGB color model is an additive color model in which red, green and blue light are added together in various ways to reproduce a broad array of colors. The name of the model comes from the initials of the three additive primary colors, red, green, and blue.

HSV Color Model :
HSV - (hue, saturation, value), also known as HSB (hue, saturation, brightness), is often used by artists because it is often more natural to think about a color in terms of hue and saturation than in terms of additive or subtractive color components. HSV is a transformation of an RGB colorspace, and its components and colorimetry are relative to the RGB colorspace from which it was derived.

Examples :

Input : r, g, b = 45, 215, 0 Output : h, s, v = 107.44186046511628, 100.0, 84.31372549019608

Input : r, g, v = 31, 52, 29 Output : h, s, v = 114.78260869565217, 44.230769230769226, 20.392156862745097

Approach :

  1. Divide r, g, b by 255
  2. Compute cmax, cmin, difference
  3. Hue calculation :
  1. Saturation computation :
  1. Value computation :

Below is the implementation of above approach :

C++ `

// C++ program change RGB Color // Model to HSV Color Model #include <bits/stdc++.h> using namespace std;

void rgb_to_hsv(double r, double g, double b) {

// R, G, B values are divided by 255
// to change the range from 0..255 to 0..1
r = r / 255.0;
g = g / 255.0;
b = b / 255.0;

// h, s, v = hue, saturation, value
double cmax = max(r, max(g, b)); // maximum of r, g, b
double cmin = min(r, min(g, b)); // minimum of r, g, b
double diff = cmax - cmin; // diff of cmax and cmin.
double h = -1, s = -1;

// if cmax and cmax are equal then h = 0
if (cmax == cmin)
    h = 0;

// if cmax equal r then compute h
else if (cmax == r)
    h = fmod(60 * ((g - b) / diff) + 360, 360);

// if cmax equal g then compute h
else if (cmax == g)
    h = fmod(60 * ((b - r) / diff) + 120, 360);

// if cmax equal b then compute h
else if (cmax == b)
    h = fmod(60 * ((r - g) / diff) + 240, 360);

// if cmax equal zero
if (cmax == 0)
    s = 0;
else
    s = (diff / cmax) * 100;

// compute v
double v = cmax * 100;
cout << "(" << h << ", " << s << ", " << v << ")"
     << endl;

}

// Driver Code int main() { // rgb_to_hsv(45, 215, 0); // rgb_to_hsv(31, 52, 29); rgb_to_hsv(129, 88, 47); }

// This code is contributed by phasing17

Java

// Java program change RGB Color // Model to HSV Color Model class GFG {

static void rgb_to_hsv(double r, double g, double b)
{

    // R, G, B values are divided by 255
    // to change the range from 0..255 to 0..1
    r = r / 255.0;
    g = g / 255.0;
    b = b / 255.0;

    // h, s, v = hue, saturation, value
    double cmax = Math.max(r, Math.max(g, b)); // maximum of r, g, b
    double cmin = Math.min(r, Math.min(g, b)); // minimum of r, g, b
    double diff = cmax - cmin; // diff of cmax and cmin.
    double h = -1, s = -1;
    
    // if cmax and cmax are equal then h = 0
    if (cmax == cmin)
        h = 0;

    // if cmax equal r then compute h
    else if (cmax == r)
        h = (60 * ((g - b) / diff) + 360) % 360;

    // if cmax equal g then compute h
    else if (cmax == g)
        h = (60 * ((b - r) / diff) + 120) % 360;

    // if cmax equal b then compute h
    else if (cmax == b)
        h = (60 * ((r - g) / diff) + 240) % 360;

    // if cmax equal zero
    if (cmax == 0)
        s = 0;
    else
        s = (diff / cmax) * 100;

    // compute v
    double v = cmax * 100;
    System.out.println("(" + h + " " + s + " " + v + ")");

}

// Driver Code
public static void main(String[] args) 
{
    // rgb_to_hsv(45, 215, 0);
    // rgb_to_hsv(31, 52, 29);
    rgb_to_hsv(129, 88, 47);

}

}

// This code is contributed by PrinciRaj1992

Python3

Python3 program change RGB Color

Model to HSV Color Model

def rgb_to_hsv(r, g, b):

# R, G, B values are divided by 255
# to change the range from 0..255 to 0..1:
r, g, b = r / 255.0, g / 255.0, b / 255.0

# h, s, v = hue, saturation, value
cmax = max(r, g, b)    # maximum of r, g, b
cmin = min(r, g, b)    # minimum of r, g, b
diff = cmax-cmin       # diff of cmax and cmin.

# if cmax and cmax are equal then h = 0
if cmax == cmin: 
    h = 0

# if cmax equal r then compute h
elif cmax == r: 
    h = (60 * ((g - b) / diff) + 360) % 360

# if cmax equal g then compute h
elif cmax == g:
    h = (60 * ((b - r) / diff) + 120) % 360

# if cmax equal b then compute h
elif cmax == b:
    h = (60 * ((r - g) / diff) + 240) % 360

# if cmax equal zero
if cmax == 0:
    s = 0
else:
    s = (diff / cmax) * 100

# compute v
v = cmax * 100
return h, s, v

''' Driver Code '''

print(rgb_to_hsv(45, 215, 0))

print(rgb_to_hsv(31, 52, 29))

print(rgb_to_hsv(129, 88, 47))

C#

// C# program change RGB Color // Model to HSV Color Model using System;

class GFG {

static void rgb_to_hsv(double r, double g, double b)
{

    // R, G, B values are divided by 255
    // to change the range from 0..255 to 0..1
    r = r / 255.0;
    g = g / 255.0;
    b = b / 255.0;

    // h, s, v = hue, saturation, value
    double cmax = Math.Max(r, Math.Max(g, b)); // maximum of r, g, b
    double cmin = Math.Min(r, Math.Min(g, b)); // minimum of r, g, b
    double diff = cmax - cmin; // diff of cmax and cmin.
    double h = -1, s = -1;
    
    // if cmax and cmax are equal then h = 0
    if (cmax == cmin)
        h = 0;

    // if cmax equal r then compute h
    else if (cmax == r)
        h = (60 * ((g - b) / diff) + 360) % 360;

    // if cmax equal g then compute h
    else if (cmax == g)
        h = (60 * ((b - r) / diff) + 120) % 360;

    // if cmax equal b then compute h
    else if (cmax == b)
        h = (60 * ((r - g) / diff) + 240) % 360;

    // if cmax equal zero
    if (cmax == 0)
        s = 0;
    else
        s = (diff / cmax) * 100;

    // compute v
    double v = cmax * 100;
    Console.WriteLine("(" + h + " " + s + " " + v + ")");

}

// Driver Code
public static void Main(String[] args) 
{
    // rgb_to_hsv(45, 215, 0);
    // rgb_to_hsv(31, 52, 29);
    rgb_to_hsv(129, 88, 47);

}

}

// This code is contributed by Rajput-Ji

JavaScript

`

Output

(30, 63.5659, 50.5882)

Time Complexity: O(1)
Auxiliary Space: O(1), As constant extra space is used.