Open In App

# 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 :

1. Divide r, g, b by 255
2. Compute cmax, cmin, difference
3. 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
4. Saturation computation :
• if cmax = 0, then s = 0
• if cmax does not equal 0 then compute s = (diff/cmax)*100
5. Value computation :
• v = cmax*100

Below is the implementation of above approach :

## C++

 `// C++ program change RGB Color``// Model to HSV Color Model``#include ``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.