-
Notifications
You must be signed in to change notification settings - Fork 5
/
RGB2Lab.m
executable file
·69 lines (55 loc) · 1.74 KB
/
RGB2Lab.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
function [L,a,b] = RGB2Lab(color_image)
% function [L, a, b] = RGB2Lab(R, G, B)
% RGB2Lab takes matrices corresponding to Red, Green, and Blue, and
% transforms them into CIELab. This transform is based on ITU-R
% Recommendation BT.709 using the D65 white point reference.
% The error in transforming RGB -> Lab -> RGB is approximately
% 10^-5. RGB values can be either between 0 and 1 or between 0 and 255.
% By Mark Ruzon from C code by Yossi Rubner, 23 September 1997.
% Updated for MATLAB 5 28 January 1998.
% commented out grayscale case
% if (nargin == 1)
% B = double(R(:,:,3));
% G = double(R(:,:,2));
% R = double(R(:,:,1));
% end
% commented out error checking, jhhays
% if ((max(max(R)) > 1.0) | (max(max(G)) > 1.0) | (max(max(B)) > 1.0))
% R = R/255;
% G = G/255;
% B = B/255;
% end
M = size(color_image,1);
N = size(color_image,2);
s = M*N;
% Set a threshold
T = 0.008856;
RGB = [reshape(color_image(:,:,1),1,s); ...
reshape(color_image(:,:,2),1,s); ...
reshape(color_image(:,:,3),1,s)];
% RGB to XYZ
MAT = [0.412453 0.357580 0.180423;
0.212671 0.715160 0.072169;
0.019334 0.119193 0.950227];
XYZ = MAT * RGB;
X = XYZ(1,:) / 0.950456;
Y = XYZ(2,:);
Z = XYZ(3,:) / 1.088754;
XT = X > T;
YT = Y > T;
ZT = Z > T;
fX = XT .* X.^(1/3) + (~XT) .* (7.787 .* X + 16/116);
% Compute L
Y3 = Y.^(1/3);
fY = YT .* Y3 + (~YT) .* (7.787 .* Y + 16/116);
L = YT .* (116 * Y3 - 16.0) + (~YT) .* (903.3 * Y);
fZ = ZT .* Z.^(1/3) + (~ZT) .* (7.787 .* Z + 16/116);
% Compute a and b
a = 500 * (fX - fY);
b = 200 * (fY - fZ);
L = reshape(L, M, N);
a = reshape(a, M, N);
b = reshape(b, M, N);
if ((nargout == 1) | (nargout == 0))
L = cat(3,L,a,b);
end