Mutual Conversion Between MATLAB Image Processing _ HSV and RGB color space, and MATLAB _ HSV

Source: Internet
Author: User
Tags color gamut

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


Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.