Program to Change RGB color model to HSV color model
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 :
- v = cmax*100
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
<script> // javascript program change RGB Color // Model to HSV Color Model function 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 = r / 255.0; g = g / 255.0; b = b / 255.0; // h, s, v = hue, saturation, value var cmax = Math.max(r, Math.max(g, b)); // maximum of r, g, b var cmin = Math.min(r, Math.min(g, b)); // minimum of r, g, b var diff = cmax - cmin; // diff of cmax and cmin. var 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 var v = cmax * 100; document.write( "(" + h.toFixed(1) + ", " + s + ", " + v + ")" ); } // Driver Code // rgb_to_hsv(45, 215, 0); // rgb_to_hsv(31, 52, 29); rgb_to_hsv(129, 88, 47); // This code is contributed by todaysgaurav </script> |
(30, 63.5659, 50.5882)
Time Complexity: O(1)
Auxiliary Space: O(1), As constant extra space is used.