标签:
废话不多说,没什么技术含量,因为下面的代码是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
标签:
原文地址:http://blog.csdn.net/scottly1/article/details/42581307