Matlab HSL通道和RGB通道之间的转换 HSL2RGB RGB2HSL

在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

 

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值