这两天做实验要用到Lab颜色空间,图像从常规的RGB颜色空间转换为Lab颜色空间,在Matlab中没有现成的实现,而网上搜到的很多算法与书本上的总有些差距,并且效果不佳,所以自己按照书上的转换公式写了段程序。
Lab颜色空间的介绍,可以参考维基百科的Lab色彩空间,但其最后的转换公式不够完备。
Lab颜色空间一般从XYZ颜色空间导出,因此首先要从RGB颜色空间转换到XYZ颜色空间,转换公式如下:

从XYZ颜色空间到Lab颜色空间的转换关系为:

其中,Xn、Yn、Zn是参考白光的三色刺激值,而

根据以上的公式,可以得到相应的Matlab程序如下:
rgb2lab.m文件:
function [labFrame] = rgb2lab(rgbFrame)
% RGB色彩空间到Lab色彩空间的转换
%初始化变量
[frameHeight, frameWidth, frameDepth] = size(rgbFrame);
labFrame = zeros(frameHeight, frameWidth, frameDepth);
l = zeros(frameHeight, frameWidth);
%RGB转换到XYZ
R = double(rgbFrame(:, :, 1));
G = double(rgbFrame(:, :, 2));
B = double(rgbFrame(:, :, 3));
X = 0.412 * R + 0.358 * G + 0.180 * B;
Y = 0.213 * R + 0.715 * G + 0.072 * B;
Z = 0.019 * R + 0.119 * G + 0.950 * B;
x = X / 255;
y = Y / 255;
z = Z / 255;
%XYZ转换到Lab
index = find(y > 0.008856);
l(index) = 166 .* y(index) .^ (1 / 3);
index = setdiff((1 : frameHeight * frameWidth)', index);
l(index) = 903.3 .* y(index);
labFrame(:, :, 1) = l;
labFrame(:, :, 2) = 500 .* (rgb2labft(x) - rgb2labft(y));
labFrame(:, :, 3) = 200 .* (rgb2labft(y) - rgb2labft(z));
end
rgb2labft.m文件:
function ft = rgb2labft(t)
[r, c] = size(t);
ft = zeros(r, c);
index = find(t > 0.008856);
ft(index) = t(index) .^ (1 / 3);
index = setdiff((1 : r * c)', index);
ft(index) = 7.787 .* t(index) + 16 / 116;
end
此外,相应的逆变换也可以推导出来,详情请见参考资料。
Resources & Reference:
1、林福宗. 多媒体技术基础(第3版) [M]. 北京:清华大学出版社,2009,第6章,PPT链接.




结果里怎么会有负值?哪里错了?