% H=0.33;
% S=0.5;
% V=0.66;
function [CIE_L,CIE_a,CIE_b]=hsv2cielab(H,S,V)
if (S==0) %HSV from 0 to 1
R=V;
G = V ;
B = V ;
else
var_h = H * 6;
if ( var_h == 6 ) var_h = 0; %/H must be < 1
end
var_i = floor( var_h ) ; %Or ... var_i = floor( var_h )
var_1 = V * ( 1 - S );
var_2 = V * ( 1 - S * ( var_h - var_i ) );
var_3 = V * ( 1 - S * ( 1 - ( var_h - var_i ) ) );
if ( var_i == 0 )
var_r = V;
var_g = var_3;
var_b = var_1;
else
if ( var_i == 1 )
var_r = var_2;
var_g = V;
var_b = var_1;
else
if ( var_i == 2 )
var_r = var_1 ;
var_g = V ;
var_b = var_3 ;
else
if ( var_i == 3 )
var_r = var_1 ;
var_g = var_2 ;
var_b = V ;
else
if ( var_i == 4 )
var_r = var_3 ;
var_g = var_1 ;
var_b = V ;
else
var_r = V ;
var_g = var_1 ;
var_b = var_2 ;
end
end
end
end
end
R = var_r; %RGB results from 0 to 255
G = var_g;
B = var_b ;
end
%-------------------------------------------
%RGB to XYZ
var_R = R ; %R from 0 to 255
var_G = G ; %G from 0 to 255
var_B = B ; %B from 0 to 255
if ( var_R > 0.04045 )
var_R = ( ( var_R + 0.055 ) / 1.055 ) ^ 2.4;
else
var_R = var_R / 12.92;
end
if ( var_G > 0.04045 )
var_G = ( ( var_G + 0.055 ) / 1.055 ) ^ 2.4;
else
var_G = var_G / 12.92;
end
if ( var_B > 0.04045 )
var_B = ( ( var_B + 0.055 ) / 1.055 ) ^ 2.4;
else
var_B = var_B / 12.92;
end
var_R = var_R * 100;
var_G = var_G * 100;
var_B = var_B * 100;
%Observer. = 2�, Illuminant = D65
X = var_R * 0.4124 + var_G * 0.3576 + var_B * 0.1805;
Y = var_R * 0.2126 + var_G * 0.7152 + var_B * 0.0722;
Z = var_R * 0.0193 + var_G * 0.1192 + var_B * 0.9505;
%----------------------------------------
%XYZ to CIELab
ref_X = 95.047;
ref_Y = 100.000;
ref_Z = 108.883;
var_X = X / ref_X; % Observer= 2�, Illuminant= D65
var_Y = Y / ref_Y ; %
var_Z = Z / ref_Z ; %
if ( var_X > 0.008856 )
var_X = var_X ^ ( 1/3 );
else
var_X = ( 7.787 * var_X ) + ( 16 / 116 );
end
if ( var_Y > 0.008856 )
var_Y = var_Y ^ ( 1/3 );
else
var_Y = ( 7.787 * var_Y ) + ( 16 / 116 );
end
if ( var_Z > 0.008856 )
var_Z = var_Z ^ ( 1/3 );
else
var_Z = ( 7.787 * var_Z ) + ( 16 / 116 );
end
CIE_L = (( 116 * var_Y ) - 16);
CIE_a = 500 * ( var_X - var_Y );
CIE_b = 200 * ( var_Y - var_Z );
评论0