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 :
- Divide r, g, b by 255
- Compute cmax, cmin, difference
- Hue calculation :
- if cmax and cmin are equal, then h = 0
- if cmax equal r then compute h = (60 * ((g – b) / diff) + 360) % 360
- if cmax equal g then compute h = (60 * ((b – r) / diff) + 120) % 360
- if cmax equal b then compute h = (60 * ((r – g) / diff) + 240) % 360
- Saturation computation :
- if cmax = 0, then s = 0
- if cmax does not equal 0 then compute s = (diff/cmax)*100
- Value computation :
Below is the implementation of above approach :
C++
#include <bits/stdc++.h>
using namespace std;
void rgb_to_hsv( double r, double g, double b)
{
r = r / 255.0;
g = g / 255.0;
b = b / 255.0;
double cmax = max(r, max(g, b));
double cmin = min(r, min(g, b));
double diff = cmax - cmin;
double h = -1, s = -1;
if (cmax == cmin)
h = 0;
else if (cmax == r)
h = fmod (60 * ((g - b) / diff) + 360, 360);
else if (cmax == g)
h = fmod (60 * ((b - r) / diff) + 120, 360);
else if (cmax == b)
h = fmod (60 * ((r - g) / diff) + 240, 360);
if (cmax == 0)
s = 0;
else
s = (diff / cmax) * 100;
double v = cmax * 100;
cout << "(" << h << ", " << s << ", " << v << ")"
<< endl;
}
int main()
{
rgb_to_hsv(129, 88, 47);
}
|
Java
class GFG
{
static void rgb_to_hsv( double r, double g, double b)
{
r = r / 255.0 ;
g = g / 255.0 ;
b = b / 255.0 ;
double cmax = Math.max(r, Math.max(g, b));
double cmin = Math.min(r, Math.min(g, b));
double diff = cmax - cmin;
double h = - 1 , s = - 1 ;
if (cmax == cmin)
h = 0 ;
else if (cmax == r)
h = ( 60 * ((g - b) / diff) + 360 ) % 360 ;
else if (cmax == g)
h = ( 60 * ((b - r) / diff) + 120 ) % 360 ;
else if (cmax == b)
h = ( 60 * ((r - g) / diff) + 240 ) % 360 ;
if (cmax == 0 )
s = 0 ;
else
s = (diff / cmax) * 100 ;
double v = cmax * 100 ;
System.out.println( "(" + h + " " + s + " " + v + ")" );
}
public static void main(String[] args)
{
rgb_to_hsv( 129 , 88 , 47 );
}
}
|
Python3
def rgb_to_hsv(r, g, b):
r, g, b = r / 255.0 , g / 255.0 , b / 255.0
cmax = max (r, g, b)
cmin = min (r, g, b)
diff = cmax - cmin
if cmax = = cmin:
h = 0
elif cmax = = r:
h = ( 60 * ((g - b) / diff) + 360 ) % 360
elif cmax = = g:
h = ( 60 * ((b - r) / diff) + 120 ) % 360
elif cmax = = b:
h = ( 60 * ((r - g) / diff) + 240 ) % 360
if cmax = = 0 :
s = 0
else :
s = (diff / cmax) * 100
v = cmax * 100
return h, s, v
print (rgb_to_hsv( 129 , 88 , 47 ))
|
C#
using System;
class GFG
{
static void rgb_to_hsv( double r, double g, double b)
{
r = r / 255.0;
g = g / 255.0;
b = b / 255.0;
double cmax = Math.Max(r, Math.Max(g, b));
double cmin = Math.Min(r, Math.Min(g, b));
double diff = cmax - cmin;
double h = -1, s = -1;
if (cmax == cmin)
h = 0;
else if (cmax == r)
h = (60 * ((g - b) / diff) + 360) % 360;
else if (cmax == g)
h = (60 * ((b - r) / diff) + 120) % 360;
else if (cmax == b)
h = (60 * ((r - g) / diff) + 240) % 360;
if (cmax == 0)
s = 0;
else
s = (diff / cmax) * 100;
double v = cmax * 100;
Console.WriteLine( "(" + h + " " + s + " " + v + ")" );
}
public static void Main(String[] args)
{
rgb_to_hsv(129, 88, 47);
}
}
|
Javascript
<script>
function rgb_to_hsv(r , g , b) {
r = r / 255.0;
g = g / 255.0;
b = b / 255.0;
var cmax = Math.max(r, Math.max(g, b));
var cmin = Math.min(r, Math.min(g, b));
var diff = cmax - cmin;
var h = -1, s = -1;
if (cmax == cmin)
h = 0;
else if (cmax == r)
h = (60 * ((g - b) / diff) + 360) % 360;
else if (cmax == g)
h = (60 * ((b - r) / diff) + 120) % 360;
else if (cmax == b)
h = (60 * ((r - g) / diff) + 240) % 360;
if (cmax == 0)
s = 0;
else
s = (diff / cmax) * 100;
var v = cmax * 100;
document.write( "(" + h.toFixed(1) + ", " + s + ", " + v + ")" );
}
rgb_to_hsv(129, 88, 47);
</script>
|
Output(30, 63.5659, 50.5882)
Time Complexity: O(1)
Auxiliary Space: O(1), As constant extra space is used.