MATLAB中的XYZ颜色模型的光谱数据

时间:2014-08-06 20:43:36

标签: matlab colors rgb spectrum

我在MATLAB工作,尝试拍摄样本的反射光谱并显示感知的颜色,作为近似值。

我使用了从CIE(2006)2-deg LMS锥形基础转换而来的2-deg XYZ CMF,其中http://cvrl.ioo.ucl.ac.uk/cmfs.htm的步长为0.1nm,作为我的色彩匹配函数。

我使用了这里显示的三个公式:http://www.fourmilab.ch/documents/specrend/

我认为它应该非常简单,但不知怎的,我正在评估我正在评估的光谱的Z值大约为120,这高于Z的允许范围。

为了获得更高的准确度,我尝试插入我的匹配函数,但我得到的结果与之前的结果非常相似。

function [X,Y,Z, RGB] = spectrumtoXYZ(P, Lambda, x, y, z)

% - P is the spectrum
% - Lambda is the wavelength for which I have my matching function data
%   points
% - x,y,z are the matching functions

X=0;Y=0;Z=0;

%Delta Lambda as specified here https://www.fourmilab.ch/documents/specrend/
del = (P(end,1)-P(1,1))/length(P);

for i=1:length(P)   
    %I look for the closest wavelength available in the matching function
    [~, j] = min(abs(P(i,1)-Lambda));
    fx=0;fy=0;fz=0;

    % Linear interpolation of Lambda for better integral accuracy
    if (P(i,1)-Lambda(j))>0 && j~=length(Lambda)
        fx=x(j)+(x(j+1)-x(j))/(Lambda(j+1)-Lambda(j))*(P(i,1)-Lambda(j));
        fy=y(j)+(y(j+1)-y(j))/(Lambda(j+1)-Lambda(j))*(P(i,1)-Lambda(j));
        fz=z(j)+(z(j+1)-z(j))/(Lambda(j+1)-Lambda(j))*(P(i,1)-Lambda(j));
    end

    if (P(i,1)-Lambda(j))<=0 && j~=1
        fx=x(j)+(x(j)-x(j-1))/(Lambda(j)-Lambda(j-1))*(P(i,1)-Lambda(j));
        fy=y(j)+(y(j)-y(j-1))/(Lambda(j)-Lambda(j-1))*(P(i,1)-Lambda(j));
        fz=z(j)+(z(j)-z(j-1))/(Lambda(j)-Lambda(j-1))*(P(i,1)-Lambda(j));
    end

    %Integral
    X=del*fx*P(i,2)+X;
    Y=del*fy*P(i,2)+Y;
    Z=del*fz*P(i,2)+Z;
end

% X,Y,Z to RGB; Ref. http://en.wikipedia.org/wiki/CIE_1931_color_space
M=[0.41847 -0.15866 -0.082835; -0.091169 0.25243 0.015708; 0.00092090 -0.0025498 0.17860];
RGB = M*[X;Y;Z];
end

我的推理/代码中是否存在明显的错误?我一直盯着这几个小时。关于我可以测试什么来排除故障的任何想法?

0 个答案:

没有答案