在处理图像的过程中常常需要对图像的不同格式进行处理。
例如需要将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
- function y=rgb2lab(im)
- % rgb2lab( image )
- % Converte de RGB para LAB
- % Define as constantes
- Xn = 95.13;
- Yn = 100.0;
- Zn = 108.86;
- disp('Iniciando a conversao de RGB para LAB');
- % Converte de RGB para XYZ
- xyz = rgb2xyz(im);
- bx = xyz(:,:,1);
- by = xyz(:,:,2);
- bz = xyz(:,:,3);
- % Calcula X / Xn, Y / Yn e Z / Zn
- bx = bx / Xn;
- by = by / Yn;
- bz = bz / Zn;
- % Determina os elem. maiores ou iguais a 8.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;
- % Determina os elem. menores que 8.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));
- % Calcula L, A e B
- 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