Files
matlab/common/color/cielab2xyz.m
T
2022-06-30 13:32:40 +02:00

46 lines
1.3 KiB
Matlab
Executable File

% 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;