Color Space Conversion: 为什么lab2rgb(rgb2lab(RGB))不能完全恢复RGB图像?

Color Space Conversion: Why lab2rgb(rgb2lab(RGB)) cannot fully recovery a RGB image?

进行颜色 space 从 RGB 到 LAB 的转换后, 我想通过LAB->RGB转换恢复原来的RGB图像

但是, 尝试时:RGB --rgb2lab --> LAB -- lab2rgb --> RGB2, 输出 RGB2 比输入 RGB 亮,为什么?

Matlab代码:imshow(lab2rgb(rgb2lab(imread('peppers.png'))))

详细:

RGB = imread('peppers.png');
LAB = rgb2lab(RGB); %convert RGB to LAB
RGB2 = lab2rgb(LAB); %try to recovery RGB
figure, 
subplot(121); imshow(RGB); 
subplot(122); imshow(RGB2);

环境:Matlab R2015a

MATLAB 提供的默认函数不会产生此错误。

此错误是由于用户自定义函数rgb2lab覆盖了默认函数造成的。 可能产生该错误的覆盖函数如下,参见GeometricContext\src\tools\misc

function [L,a,b] =rgb2lab(R,G,B)
% 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.

if (nargin == 1)
  B = double(R(:,:,3));
  G = double(R(:,:,2));
  R = double(R(:,:,1));
end

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, N] = size(R);
s = M*N;

% Set a threshold
T = 0.008856;

RGB = [reshape(R,1,s); reshape(G,1,s); reshape(B,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