mathieu@14: function hsl=rgb2hsl(rgb) mathieu@14: mathieu@14: %Converts Red-Green-Blue Color value to Hue-Saturation-Luminance Color value mathieu@14: % mathieu@14: %Usage mathieu@14: % HSL = rgb2hsl(RGB) mathieu@14: % mathieu@14: % converts RGB, a M X 3 color matrix with values between 0 and 1 mathieu@14: % into HSL, a M X 3 color matrix with values between 0 and 1 mathieu@14: % mathieu@14: %See also hsl2rgb, rgb2hsv, hsv2rgb mathieu@14: mathieu@14: %Suresh E Joel, April 26,2003 mathieu@14: mathieu@14: if nargin<1, mathieu@14: error('Too few arguements for rgb2hsl'); mathieu@14: return; mathieu@14: elseif nargin>1, mathieu@14: error('Too many arguements for rgb2hsl'); mathieu@14: return; mathieu@14: end; mathieu@14: mathieu@14: if max(max(rgb))>1 | min(min(rgb))<0, mathieu@14: error('RGB values have to be between 0 and 1'); mathieu@14: return; mathieu@14: end; mathieu@14: mathieu@14: for i=1:size(rgb,1), mathieu@14: mx=max(rgb(i,:));%max of the 3 colors mathieu@14: mn=min(rgb(i,:));%min of the 3 colors mathieu@14: imx=find(rgb(i,:)==mx);%which color has the max mathieu@14: hsl(i,3)=(mx+mn)/2;%luminance is half of max value + min value mathieu@14: if(mx-mn)==0,%if all three colors have same value, mathieu@14: hsl(i,2)=0;%then s=0 and mathieu@14: hsl(i,1)=0;%h is undefined but for practical reasons 0 mathieu@14: return; mathieu@14: end; mathieu@14: if hsl(i,3)<0.5, mathieu@14: hsl(i,2)=(mx-mn)/(mx+mn); mathieu@14: else mathieu@14: hsl(i,2)=(mx-mn)/(2-(mx+mn)); mathieu@14: end; mathieu@14: switch(imx(1))%if two colors have same value and be the maximum, use the first color mathieu@14: case 1 %Red is the max color mathieu@14: hsl(i,1)=((rgb(i,2)-rgb(i,3))/(mx-mn))/6; mathieu@14: case 2 %Green is the max color mathieu@14: hsl(i,1)=(2+(rgb(i,3)-rgb(i,1))/(mx-mn))/6; mathieu@14: case 3 %Blue is the max color mathieu@14: hsl(i,1)=(4+(rgb(i,1)-rgb(i,2))/(mx-mn))/6; mathieu@14: end; mathieu@14: 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 mathieu@14: end; mathieu@14: mathieu@14: 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)