% function [xyz] = cielab2xyz(lab, ref_xyz) % % // C-Code % var_Y = ( CIE-L* + 16 ) / 116 % var_X = CIE-a* / 500 + var_Y % var_Z = var_Y - CIE-b* / 200 % % if ( var_Y^3 > 0.008856 ) var_Y = var_Y^3 % else var_Y = ( var_Y - 16 / 116 ) / 7.787 % if ( var_X^3 > 0.008856 ) var_X = var_X^3 % else var_X = ( var_X - 16 / 116 ) / 7.787 % if ( var_Z^3 > 0.008856 ) var_Z = var_Z^3 % else var_Z = ( var_Z - 16 / 116 ) / 7.787 % % X = ref_X * var_X //ref_X = 95.047 Observer= 2°, Illuminant= D65 % Y = ref_Y * var_Y //ref_Y = 100.000 % Z = ref_Z * var_Z //ref_Z = 108.883 % % Source http://www.easyrgb.com function [xyz] = cielab2xyz(lab, ref_xyz) [m,n] = size(lab); if ((m ~= 3) & (n == 3)) lab = lab' end; xyz_k(2,:) = (lab(1,:) + 16)/116; xyz_k(1,:) = lab(2,:)/500 + xyz_k(2,:); xyz_k(3,:) = xyz_k(2,:) - lab(3,:)/200; xyz = f1(xyz_k); xyz(1,:) = xyz(1,:).*ref_xyz(1,:); xyz(2,:) = xyz(2,:).*ref_xyz(2,:); xyz(3,:) = xyz(3,:).*ref_xyz(3,:); function xyz = f1(xyz_k) thresh_n = 0.008856; [idx_m, idx_n] = find(xyz_k.^3 > thresh_n); xyz(idx_m,idx_n) = xyz_k(idx_m,idx_n).^3; [idx_m, idx_n] = find(xyz_k.^3 <= thresh_n); xyz(idx_m,idx_n) = (xyz_k(idx_m,idx_n) - 16/116)/7.787;