O sistema de cores subtrativas CIE LAB

O Lab é um sistema subtrativo de cor proposto pela Commision Internationale L'Eclairage - CIE.

Essa combinação de cores subtrativa é usada para definir as cores de materiais não emitentes especialmente os pigmentos que definirão as cores dos tecidos, plasticos e tintas.

Utiliza como o LUV um canal de luminância e dois de crominância. Mas aqui a luminância é substituida pela luminosidade (ou seja a medida de como a intensidade luminosa é percebida).

O sistema CIE Lab estabelece coordenadas uniformes no espaço
tridimensional de cor.

A conversão entre o CIE Lab e o RGB ou o XYZ é cara computacionalmente.

Conversão de XYZ para LAB

Dada pelas formulas abaixo:

onde define-se: L=luminosidade
A e B correspondem a matiz que é a crominância de uma cor.
Y - corresponde a luminância da cor.
X e Z comprimentos de onda do CIE padrão.

Os codigos abaixo fazem essas trabsformações.

LAB_TO_XYZ converte CIE L*a*b* to CIE XYZ .

Definição

O sistema de cores CIE L*a*b* descreve as cores basicas em três qualidades:
L* é luminosidade, a* e b* contem a informação de croma.
Uma cor dada será representada pelos três números,(L*,a*,b*). As áreas são 0<=L*<=100,
-500<=a*<=500, -200<=b*<=200.
O sistema CIE XYZ descreve uma cor em termos das componentes X,Y e Z primárias.
Em circunstâncias ordinárias, todas as três destas componentes devem ser positivas.

Parameters:
Input, real LSTAR, ASTAR, BSTAR, the CIE L*a*b* color coordinates.

Output, real XCAP, YCAP, ZCAP, the CIE XYZ color coordinates.

Input, real XCAPN, YCAPN, ZCAPN, the CIE XYZ color coordinates of white.

 

Procedure LAB_TO_XYZ


real astar
real bstar
real cubert
real fx
real fy
real fz
real lstar
real xcap
real xcapn
real ycap
real ycapn
real zcap
real zcapn
!
if ( lstar .le. 0.0 ) then
ycap = 0.0
else if ( lstar .le. 8.0 ) then
ycap = lstar * ycapn / 903.3
else if ( lstar .le. 100.0 ) then
ycap = ycapn * ( ( lstar + 16.0 ) / 116.0 )**3
else
ycap = ycapn
end if

if ( ycap .le. 0.00856 * ycapn ) then
fy = 7.787 * ycap / ycapn + 16.0 / 116.0
else
fy = cubert ( ycap / ycapn )
end if

fx = fy + ( astar / 500.0 )

if ( fx**3 .le. 0.008856 ) then
xcap = xcapn * ( fx - 16.0 / 116.0 ) / 7.787
else
xcap = xcapn * fx**3
end if

fz = fy - ( bstar / 200.0 )

if ( fz**3 .le. 0.008856 ) then
zcap = zcapn * ( fz - 16.0 / 116.0 ) / 7.787
else
zcap = zcapn * fz**3
end if

return
end
subroutine lcc_to_rgbprime ( luma, chroma1, chroma2, yr, yg, yb, rprime, gprime, bprime )

 


XYZ_TO_LAB converes CIE XYZ to CIE L*a*b*

O sistema de cores CIE L*a*b* descreve as cores basicas em três qualidades:
L* é luminosidade, a* e b* contem a informação de croma.
Uma cor dada será representada pelos três números,(L*,a*,b*). As áreas são 0<=L*<=100,
-500<=a*<=500, -200<=b*<=200.

Parameters:

Input, real XCAP, YCAP, ZCAP, the CIE XYZ color coordinates.

Input, real XCAPN, YCAPN, ZCAPN, the CIE XYZ color coordinates of white.

Output, real LSTAR, ASTAR, BSTAR, the CIE L*a*b* color coordinates.

 

Procedure XYZ_TO_LAB

real astar
real bstar
real cubert
real fx
real fy
real fz
real lstar
real xcap
real xcapn
real ycap
real ycapn
real zcap
real zcapn

if (
& xcapn .eq. 0.0 .or.
& ycapn .eq. 0.0 .or.
& zcapn .eq. 0.0 ) then

write ( *, * ) ' '
write ( *, * ) 'XYZ_TO_LAB - Fatal error!'
write ( *, * ) ' XCAPN, YCAPN and ZCAPN cannot be zero.'
write ( *, * ) ' XCAPN = ', xcapn
write ( *, * ) ' YCAPN = ', ycapn
write ( *, * ) ' ZCAPN = ', zcapn
stop

end if

//Compute the CIE lightness.

if ( ycap .le. 0.0 ) then
lstar = 0.0
else if ( ycap .le. 0.008856 * ycapn ) then
lstar = 903.3 * ycap / ycapn
else if ( ycap .le. ycapn ) then
lstar = 116.0 * cubert ( ycap / ycapn ) - 16.0
else
lstar = 100.0
end if

if ( xcap .le. 0.008856 * xcapn ) then
fx = 7.787 * xcap / xcapn + 16.0 / 116.0
else
fx = cubert ( xcap / xcapn )
end if

if ( ycap .le. 0.008856 * ycapn ) then
fy = 7.787 * ycap / ycapn + 16.0 / 116.0
else
fy = cubert ( ycap / ycapn )
end if

if ( zcap .le. 0.008856 * zcapn ) then
fz = 7.787 * zcap / zcapn + 16.0 / 116.0
else
fz = cubert ( zcap / zcapn )
end if

astar = 500.0 * ( fx - fy )
bstar = 200.0 * ( fy - fz )

return
end
subroutine xyz_to_luv ( xcap, ycap, zcap, xcapn, ycapn, zcapn, lstar, ustar, vstar )