用MATLAB编写RGB到HSL和HSL到RGB颜色空间的转换程序:rgb2hsl.m和hsl2rgb.m
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用MATLAB编写RGB到HSL和HSL到RGB颜色空间的转换程序:rgb2hsl.m和hsl2rgb.m相关的知识,希望对你有一定的参考价值。
用MATLAB编写RGB到HSL和HSL到RGB颜色空间的转换程序:rgb2hsl.m和hsl2rgb.m
参考技术A function hsl=rgb2hsl(rgb)%Converts Red-Green-Blue Color value to Hue-Saturation-Luminance Color value
%
%Usage
% HSL = rgb2hsl(RGB)
%
% converts RGB, a M X 3 color matrix with values between 0 and 1
% into HSL, a M X 3 color matrix with values between 0 and 1
%
%See also hsl2rgb, rgb2hsv, hsv2rgb
%Suresh E Joel, April 26,2003
if nargin<1,
error('Too few arguements for rgb2hsl');
return;
elseif nargin>1,
error('Too many arguements for rgb2hsl');
return;
end;
if max(max(rgb))>1 | min(min(rgb))<0,
error('RGB values have to be between 0 and 1');
return;
end;
for i=1:size(rgb,1),
mx=max(rgb(i,:));%max of the 3 colors
mn=min(rgb(i,:));%min of the 3 colors
imx=find(rgb(i,:)==mx);%which color has the max
hsl(i,3)=(mx+mn)/2;%luminance is half of max value + min value
if(mx-mn)==0,%if all three colors have same value,
hsl(i,2)=0;%then s=0 and
hsl(i,1)=0;%h is undefined but for practical reasons 0
return;
end;
if hsl(i,3)<0.5,
hsl(i,2)=(mx-mn)/(mx+mn);
else
hsl(i,2)=(mx-mn)/(2-(mx+mn));
end;
switch(imx(1))%if two colors have same value and be the maximum, use the first color
case 1 %Red is the max color
hsl(i,1)=((rgb(i,2)-rgb(i,3))/(mx-mn))/6;
case 2 %Green is the max color
hsl(i,1)=(2+(rgb(i,3)-rgb(i,1))/(mx-mn))/6;
case 3 %Blue is the max color
hsl(i,1)=(4+(rgb(i,1)-rgb(i,2))/(mx-mn))/6;
end;
if hsl(i,1)<0,hsl(i,1)=hsl(i,1)+1;end;%if hue is negative, add 1 to get it within 0 and 1
end;
hsl=round(hsl*100000)/100000; %Sometimes the result is 1+eps instead of 1 or 0-eps instead of 0 ... so to get rid of this I am rounding to 5 decimal places)本回答被提问者采纳
AS3-HSL到RGB类
This requires the [RGB](http://snipplr.com/view/34818/as3--rgb-class-for-rgb-to-hex/) class I posted as well
/** * @author Rivaledsouls * @version 1.0 * Feel free to use this code as you wish as long as you cite * me, Rivaledsouls, for use of the code in any projects where * you share the source. * (c) 2010 */ package utils.color{ public class HSL { private var luminance:Number; private var saturation:Number; private var hue:Number; /** * Contructs an HSL object for containing Hue Saturation and Luminance values, and * converting them to an RGB or Hex color * @param h Hue (0-360) * @param s Saturation(0-1) * @param l Luminance(0-1) */ public function HSL(h:Number=0, s:Number=1, l:Number=.5) { hue = h; saturation = s; luminance = l; } /* * Getters for each channel */ public function get Hue():Number { return hue; } public function get Saturation():Number { return saturation; } public function get Luminance():Number { return luminance; } /* *Setters for each channel */ public function set Hue(Value:Number):void { hue = (Value>360)? Value-360 : ((Value<0)?Value+360:Value); } public function set Saturation(Value:Number):void { saturation = (Value>1)? 1 : ((Value<0)?0:Value); } public function set Luminance(Value:Number):void { luminance = (Value>1)? 1 : ((Value<0)?0:Value); } /** * Converts the HSL object to an RGB object defining the same color * @return RGB object */ public function toRGB():RGB{ return getRGB(hue, saturation, luminance); } /** * Converts the HSL object to a Hex value defining the same color * @return Hex value of HSL color */ public function toHex():uint { return toRGB().Hex; } /** * Static method for directly converting HSL values to Hex * @param h Hue (0-360) * @param s Saturation(0-1) * @param l Luminance(0-1) * @return a Hex value represnting the given HSL values */ public static function getHex(h:Number, s:Number, l:Number):uint{ return getRGB(h, s, l).Hex; } /** * Static method for directly converting HSL values to * an RGB object * @param h Hue (0-360) * @param s Saturation(0-1) * @param l Luminance(0-1) * @return an RGB object represnting the given HSL values */ public static function getRGB(h:Number, s:Number, l:Number):RGB{ h = h / 360; var r:Number; var g:Number; var b:Number; if(l==0) { r=g=b=0; } else { if(s == 0) { r=g=b=l; } else { var t2:Number = (l<=0.5)? l*(1+s):l+s-(l*s); var t1:Number = 2*l-t2; var t3:Vector.<Number> = new Vector.<Number>(); t3.push(h+1/3); t3.push(h); t3.push(h-1/3); var clr:Vector.<Number> = new Vector.<Number>(); clr.push(0); clr.push(0); clr.push(0); for(var i:int=0;i<3;i++) { if(t3[i]<0) t3[i]+=1; if(t3[i]>1) t3[i]-=1; if(6*t3[i] < 1) clr[i]=t1+(t2-t1)*t3[i]*6; else if(2*t3[i]<1) clr[i]=t2; else if(3*t3[i]<2) clr[i]=(t1+(t2-t1)*((2/3)-t3[i])*6); else clr[i]=t1; } r=clr[0]; g=clr[1]; b=clr[2]; } } return new RGB(int(r*255),int(g*255),int(b*255)); } } }
以上是关于用MATLAB编写RGB到HSL和HSL到RGB颜色空间的转换程序:rgb2hsl.m和hsl2rgb.m的主要内容,如果未能解决你的问题,请参考以下文章