Mutual Conversion Between MATLAB Image Processing _ HSV and RGB color space, and MATLAB _ HSV
The following code is a self-carried Conversion Function in matlab. It is posted here to facilitate future review and Study of Its Conversion Algorithm:
HSV space: H (tone) -- S (saturation) -- V (brightness)
Similar to the HSI color space: H (tone) -- S (saturation) -- I (intensity)
Note:
Intensity and brightness are actually a concept.
Saturation indicates the order of magnitude of the white light. The more white light, the smaller the saturation, the less white light, and the greater the saturation, the greater the color purity.
The following code is used:
Rgb2hsv. m
function [h,s,v] = rgb2hsv(r,g,b)%RGB2HSV Convert red-green-blue colors to hue-saturation-value.% H = RGB2HSV(M) converts an RGB color map to an HSV color map.% Each map is a matrix with any number of rows, exactly three columns,% and elements in the interval 0 to 1. The columns of the input matrix,% M, represent intensity of red, blue and green, respectively. The% columns of the resulting output matrix, H, represent hue, saturation% and color value, respectively.%% HSV = RGB2HSV(RGB) converts the RGB image RGB (3-D array) to the% equivalent HSV image HSV (3-D array).%% CLASS SUPPORT% -------------% If the input is an RGB image, it can be of class uint8, uint16, or % double; the output image is of class double. If the input is a % colormap, the input and output colormaps are both of class double.% % See also HSV2RGB, COLORMAP, RGBPLOT. % Undocumented syntaxes:% [H,S,V] = RGB2HSV(R,G,B) converts the RGB image R,G,B to the% equivalent HSV image H,S,V.%% HSV = RGB2HSV(R,G,B) converts the RGB image R,G,B to the % equivalent HSV image stored in the 3-D array (HSV).%% [H,S,V] = RGB2HSV(RGB) converts the RGB image RGB (3-D array) to% the equivalent HSV image H,S,V.%% See Alvy Ray Smith, Color Gamut Transform Pairs, SIGGRAPH '78.% Copyright 1984-2006 The MathWorks, Inc. % $Revision: 5.15.4.3 $ $Date: 2010/08/23 23:13:14 $switch nargin case 1, if isa(r, 'uint8'), r = double(r) / 255; elseif isa(r, 'uint16') r = double(r) / 65535; end case 3, if isa(r, 'uint8'), r = double(r) / 255; elseif isa(r, 'uint16') r = double(r) / 65535; end if isa(g, 'uint8'), g = double(g) / 255; elseif isa(g, 'uint16') g = double(g) / 65535; end if isa(b, 'uint8'), b = double(b) / 255; elseif isa(b, 'uint16') b = double(b) / 65535; end otherwise, error(message('MATLAB:rgb2hsv:WrongInputNum'));end threeD = (ndims(r)==3); % Determine if input includes a 3-D arrayif threeD, g = r(:,:,2); b = r(:,:,3); r = r(:,:,1); siz = size(r); r = r(:); g = g(:); b = b(:);elseif nargin==1, g = r(:,2); b = r(:,3); r = r(:,1); siz = size(r);else if ~isequal(size(r),size(g),size(b)), error(message('MATLAB:rgb2hsv:InputSizeMismatch')); end siz = size(r); r = r(:); g = g(:); b = b(:);endv = max(max(r,g),b);h = zeros(size(v));s = (v - min(min(r,g),b));z = ~s;s = s + z;k = find(r == v);h(k) = (g(k) - b(k))./s(k);k = find(g == v);h(k) = 2 + (b(k) - r(k))./s(k);k = find(b == v);h(k) = 4 + (r(k) - g(k))./s(k);h = h/6;k = find(h < 0);h(k) = h(k) + 1;h=(~z).*h;k = find(v);s(k) = (~z(k)).*s(k)./v(k);s(~v) = 0;if nargout<=1, if (threeD || nargin==3), h = reshape(h,siz); s = reshape(s,siz); v = reshape(v,siz); h=cat(3,h,s,v); else h=[h s v]; endelse h = reshape(h,siz); s = reshape(s,siz); v = reshape(v,siz);end
HSV 2rgb. m
function [rout,g,b] = hsv2rgb(hin,s,v)%HSV2RGB Convert hue-saturation-value colors to red-green-blue.% M = HSV2RGB(H) converts an HSV color map to an RGB color map.% Each map is a matrix with any number of rows, exactly three columns,% and elements in the interval 0 to 1. The columns of the input matrix,% H, represent hue, saturation and value, respectively. The columns of% the resulting output matrix, M, represent intensity of red, blue and% green, respectively.%% RGB = HSV2RGB(HSV) converts the HSV image HSV (3-D array) to the% equivalent RGB image RGB (3-D array).%% As the hue varies from 0 to 1, the resulting color varies from% red, through yellow, green, cyan, blue and magenta, back to red.% When the saturation is 0, the colors are unsaturated; they are% simply shades of gray. When the saturation is 1, the colors are% fully saturated; they contain no white component. As the value% varies from 0 to 1, the brightness increases.%% The colormap HSV is hsv2rgb([h s v]) where h is a linear ramp% from 0 to 1 and both s and v are all 1's.%% See also RGB2HSV, COLORMAP, RGBPLOT.% Undocumented syntaxes:% [R,G,B] = HSV2RGB(H,S,V) converts the HSV image H,S,V to the% equivalent RGB image R,G,B.%% RGB = HSV2RGB(H,S,V) converts the HSV image H,S,V to the % equivalent RGB image stored in the 3-D array (RGB).%% [R,G,B] = HSV2RGB(HSV) converts the HSV image HSV (3-D array) to% the equivalent RGB image R,G,B.% See Alvy Ray Smith, Color Gamut Transform Pairs, SIGGRAPH '78.% Copyright 1984-2011 The MathWorks, Inc. if nargin == 1 % HSV colormap threeD = ndims(hin)==3; % Determine if input includes a 3-D array if threeD, h = hin(:,:,1); s = hin(:,:,2); v = hin(:,:,3); else h = hin(:,1); s = hin(:,2); v = hin(:,3); endelseif nargin == 3 if ~isequal(size(hin),size(s),size(v)), error(message('MATLAB:hsv2rgb:InputSizeMismatch')); end h = hin;else error(message('MATLAB:hsv2rgb:WrongInputNum'));end h = 6.*h;k = floor(h);p = h-k;t = 1-s;n = 1-s.*p;p = 1-(s.*(1-p));% Processing each value of k separately to avoid simultaneously storing% many temporary matrices the same size as k in memorykc = (k==0 | k==6);r = kc;g = kc.*p;b = kc.*t;kc = (k==1);r = r + kc.*n;g = g + kc;b = b + kc.*t;kc = (k==2);r = r + kc.*t;g = g + kc;b = b + kc.*p;kc = (k==3);r = r + kc.*t;g = g + kc.*n;b = b + kc;kc = (k==4);r = r + kc.*p;g = g + kc.*t;b = b + kc;kc = (k==5);r = r + kc;g = g + kc.*t;b = b + kc.*n;if nargout <= 1 if nargin == 3 || threeD rout = cat(3,r,g,b); else rout = [r g b]; end rout = bsxfun(@times, v./max(rout(:)), rout);else f = v./max([max(r(:)); max(g(:)); max(b(:))]); rout = f.*r; g = f.*g; b = f.*b;end