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 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
function [macTransmit,macDensity] = MacularTransmittance(S,species,source,fieldSizeDegrees)
% [macTransmit,macDensity] = MacularTransmittance(S,[species],[source],[fieldSizeDegrees])
%
% Return an estimate of the transmittance of the macular pigment transmittance
% as a function of wavelength.
%
% Allowable species:
% Human (Default)
%
% Allowable sources:
% CIE (Default) - CIE 170-1:2006 values.
% Bone - From Bone et al. See CVRL database.
% WyszeckiStiles - From W&S, Table 2(2.4.6), p. 112.
% Vos - From Vos. See CVRL database.
% None - Unity transmittance.
%
% For the CIE option, can pass fieldSizeDegrees [Default 2 degrees].
% This was buggy until the version of 5/8/12.
%
% The Bone values that we use a the basis for this calculation
% match those in CIE 170-1:2006, Table 6.4 for a 2-degree observer.
%
% The answer is returned in a row vector. This function
% depends on data contained in directory
% PsychColorimetricData:PsychColorimetricMatFiles.
%
% 7/8/03 dhb Made this a separate function.
% 7/11/03 dhb Species arg, change name.
% 7/23/03 dhb Change default.
% 7/26/03 dhb Extend functions, rather than zero truncate.
% 8/12/11 dhb Fixed default to match comments.
% dhb Add CIE option and made it default.
% dhb For CIE, can pass field size
% dhb Also return density
% 8/13/11 dhb Linearly extrapolate read functions outside of range.
% 5/8/12 dhb Fixed two bugs. First, peak optical density correction is
% multiplicative rather than additive. Second, there was
% an operator precedence grouping error in the computation
% of the correction factor.
% 5/8/12 dhb Removed comment that we can't reproduce CIE tabular 10 deg values.
% 9/17/12 dhb Return density for 'None' case as well.
% 8/9/13 dhb More consistent returning of density for 'None' case.
% 8/11/13 dhb Try to make dimensions of returned density match those of returned transmittance.
% Default
if (nargin < 2 || isempty(species))
species = 'Human';
end
if (nargin < 3 || isempty(source))
source = 'CIE';
end
if (nargin < 4 || isempty(fieldSizeDegrees))
fieldSizeDegrees = 2;
end
% Load correction for macular pigment density
switch (species)
case 'Human',
switch (source)
case 'None',
macTransmit = ones(S(3),1)';
macDensity = zeros(S(3),1)';
case 'WyszeckiStiles',
load den_mac_ws;
macDensity = SplineSrf(S_mac_ws,den_mac_ws,S,2)';
macTransmit = 10.^(-macDensity);
case 'Vos',
load den_mac_vos;
macDensity = SplineSrf(S_mac_vos,den_mac_vos,S,2)';
macTransmit = 10.^(-macDensity);
case 'Bone',
load den_mac_bone;
macDensity = SplineSrf(S_mac_bone,den_mac_bone,S,2)';
macTransmit = 10.^(-macDensity);
case 'CIE'
load den_mac_bone;
macDensity = SplineSrf(S_mac_bone,den_mac_bone,S,2)';
% Adjust for field size by adjusting peak optical density.
% This is a multiplicative adjustment, which is pretty
% easy to derive from first principles. See Rodieck, pp. 443-445.
% Our Bone values have a peak of 0.35, but the CIE formula for peak
% density produces coefficients for a peak of 1. We handle this by
% dividing the Bone values by their peak density and then applying the
% formula. And, the peak density of 0.35 is in fact obtained by
% applying the CIE formula for a 2 degree field. For tabulated
% values to check this against, see CIE 170-1:2006, p. 29, Table 6.4.
densityAdjustFieldSize = 0.485*exp(-fieldSizeDegrees/6.132) / (0.485*exp(-2/6.132));
macDensity = macDensity*densityAdjustFieldSize;
macDensity(macDensity < 0) = 0;
macTransmit = 10.^(-macDensity);
otherwise,
error('Unsupported macular pigment density estimate specified');
end
otherwise,
switch (source)
case ('None'),
macTransmit = ones(S(3),1)';
macDensity = zeros(S(3),1)';
otherwise,
error('Unsupported species specified');
end
end
|