在Matlab中没有图片HSL通道的支持,因此需要自己实现rgb2hsl(R,G,B) 和 hsl2hsl(H,S,L)函数,进行HSL通道和RGB通道之间的转换:
参考内容:http://zh.wikipedia.org/wiki/HSL
每个颜色向量Color = (ColorR, ColorG, ColorB) = (r, g, b),
1. hsl2rgb函数:可传入图片的R、G、B二维矩阵,或者RGB的单值
function [R,G,B] = hsl2rgb(H,S,L)
%HSL2RGB
[m,n]=size(H);
% 单值RGB
if m==1&&n==1
if S~=0
if L<0.5
q=L*(1+S);
else
q=L+S-(L*S);
end
p=2*L-q;
hk=H/360;
R_temp=hk+1/3;
G_temp=hk;
B_temp=hk-1/3;
R=hsl2rgb_subfun(R_temp,p,q);
G=hsl2rgb_subfun(G_temp,p,q);
B=hsl2rgb_subfun(B_temp,p,q);
else
R=L;G=L;B=L;
end
% 图片RGB
else
R=zeros(m,n);G=zeros(m,n);B=zeros(m,n);
for i=1:m
for j=1:n
s=S(i,j);
l=L(i,j);
if s~=0
h=H(i,j);
if l<0.5
q=l*(1+s);
else
q=l+s-(l*s);
end
p=2*l-q;
hk=h/360;
R_temp=hk+1/3;
G_temp=hk;
B_temp=hk-1/3;
R(i,j)=hsl2rgb_subfun(R_temp,p,q);
G(i,j)=hsl2rgb_subfun(G_temp,p,q);
B(i,j)=hsl2rgb_subfun(B_temp,p,q);
else
R(i,j)=l;
G(i,j)=l;
B(i,j)=l;
end
end
end
end
end
function re = hsl2rgb_subfun(t,p,q)
if t<0
t=t+1.0;
elseif t>1
t=t-1.0;
end
if t<1/6
re=p+((q-p)*6*t);
elseif 1/6<=t && t<0.5
re=q;
elseif 0.5<=t && t<2/3
re=p+((q-p)*6*(2/3-t));
else
re=p;
end
end
2. rgb2hsl函数:可传入图片的H、S、L二维矩阵,或者HSL的单值
function [H,S,L] = rgb2hsl(R,G,B)
%RGB2HSL
[m,n]=size(R);
% 单值的RGB
if m==1&&n==1
rgbMax=max([R,G,B]);
rgbMin=min([R,G,B]);
if rgbMax==rgbMin
H=0;
elseif rgbMax==R && G>=B
H=60*(G-B)/(rgbMax-rgbMin);
elseif rgbMax==R && G<B
H=60*(G-B)/(rgbMax-rgbMin)+360;
elseif rgbMax==G
H=60*(B-R)/(rgbMax-rgbMin)+120;
elseif rgbMax==B
H=60*(R-G)/(rgbMax-rgbMin)+240;
end
L=(rgbMax+rgbMin)/2;
if L==0 || rgbMax==rgbMin
S=0;
elseif L>0 && L<=0.5
S=(rgbMax-rgbMin)/(2*L);
elseif L>0.5
S=(rgbMax-rgbMin)/(2-2*L);
end
% 图片的RGB
else
H=zeros(m,n);
S=zeros(m,n);
L=zeros(m,n);
for i=1:m
for j=1:n
r=R(i,j);
g=G(i,j);
b=B(i,j);
rgbMax=max([r,g,b]);
rgbMin=min([r,g,b]);
if rgbMax==rgbMin
H(i,j)=0;
elseif rgbMax==r && g>=b
H(i,j)=60*(g-b)/(rgbMax-rgbMin);
elseif rgbMax==r && g<b
H(i,j)=60*(g-b)/(rgbMax-rgbMin)+360;
elseif rgbMax==g
H(i,j)=60*(b-r)/(rgbMax-rgbMin)+120;
elseif rgbMax==b
H(i,j)=60*(r-g)/(rgbMax-rgbMin)+240;
end
L(i,j)=(rgbMax+rgbMin)/2;
if L(i,j)==0 || rgbMax==rgbMin
S(i,j)=0;
elseif 0<L(i,j) && L(i,j)<=0.5
S(i,j)=(rgbMax-rgbMin)/(2*L(i,j));
elseif L(i,j)>0.5
S(i,j)=(rgbMax-rgbMin)/(2-2*L(i,j));
end
end
end
end
end