• 热门专题

MATLAB图像处理_HSV与RGB颜色空间互转

作者:  发布日期:2015-01-10 22:51:19
Tag标签:图像处理  颜色  空间  
  • 废话不多说,没什么技术含量,因为下面的代码是matlab中自带的转换函数。在这里贴出来只是为了方便以后复习、研究其转换的算法:

    HSV空间:分别是H(色调)——S(饱和度)——V(亮度)

    与HSI颜色空间类似:分别是H(色调)——S(饱和度)——I(强度)

    注意:

    强度和亮度其实是一个概念。

    饱和度代表的是渗入白光的数量级,白光越多,饱和度越小,白光越少,饱和度越大,表示颜色的纯度更大。

    下面是代码:

    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 array
    
    if 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(:);
    end
    
    v = 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];
      end
    else
      h = reshape(h,siz);
      s = reshape(s,siz);
      v = reshape(v,siz);
    end
    

    hsv2rgb.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);
        end
    elseif 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 memory
    kc = (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
    


About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规