在处理图像的过程中常常需要对图像的不同格式进行处理。
例如需要将rgb转换为lab,它们分属于不同的颜色空间。
一般来说rgb中,r、g、b的取值范围为(0,255)或者在(0,1)之间。
而lab中,l的范围为(0,100),a、b范围为(-120,120)。
而在转化过程中,通常需要将rgb先转化为xyz控件,然后再转换为lab空间。
因此需要用到两个函数,分别为,rgb2xyz,rgb2lab
下面是一段代码:
rgb2lab,来自:http://server.cs.ucf.edu/~vision/Code/ColorSpaces/rgb2lab.m
- functiony=rgb2lab(im)
- %rgb2lab(image)
- %ConvertedeRGBparaLAB
- %Defineasconstantes
- Xn=95.13;
- Yn=100.0;
- Zn=108.86;
- disp('IniciandoaconversaodeRGBparaLAB');
- %ConvertedeRGBparaXYZ
- xyz=rgb2xyz(im);
- bx=xyz(:,:,1);
- by=xyz(:,:,2);
- bz=xyz(:,:,3);
- %CalculaX/Xn,Y/YneZ/Zn
- bx=bx/Xn;
- by=by/Yn;
- bz=bz/Zn;
- %Determinaoselem.maioresouiguaisa8.856E-3
- bin=(bx>=8.856E-3);
- f_x=(bin.*bx).^(1/3);
- bin=(by>=8.856E-3);
- yyn=(bin.*by).^(1/3);
- f_y=yyn;
- bin=(bz>=8.856E-3);
- f_z=(bin.*bz).^(1/3);
- l=(116*yyn)-16;
- %Determinaoselem.menoresque8.856E-3
- bin=(bx<8.856E-3);
- f_x=f_x+(7.787*(bin.*bx)+(16/116));
- bin=(by<8.856E-3);
- yyn=(bin.*by);
- f_y=f_y+(7.787*yyn+(16/116));
- bin=(bz<8.856E-3);
- f_z=f_z+(7.787*(bin.*bz)+(16/116));
- %CalculaL,AeB
- l=l+(903.3*(yyn.^(1/3)));
- a=(500*l).*(f_x-f_y);
- b=(200*l).*(f_y-f_z);
- y(:,:,1)=l;
- y(:,:,2)=a;
- y(:,:,3)=b;
- function[xyz]=rgb2xyz(rgb)
- a=double(rgb);
- mat=[.49.31.20;.17697.81240.01063;.00.01.99];
- mat=(1/.17697)*mat;
- R=a(:,:,1);
- G=a(:,:,2);
- B=a(:,:,3);
- [m,n]=size(R);
- RGB=[R(:)G(:)B(:)]';
- XYZ=mat*RGB;
- X=XYZ(1,:);x=reshape(X,m,n);
- Y=XYZ(2,:);y=reshape(Y,m,n);
- Z=XYZ(3,:);z=reshape(Z,m,n);
- xyz=zeros(size(a));
- xyz(:,:,1)=x;
- xyz(:,:,2)=y;
- xyz(:,:,3)=z;
- end