s_HumanColorBlind

Render images using the Brettell, Vienot, Mollon 1997 method for showing appearance to the color blind.

The algorithm converts XYZ values and a white XYZ into LMS values that can be shown as color image.

(c) ImagEval 2012

Contents

Create an image and get the XYZ of the image and white

scene    = sceneCreate;
imgXYZ   = sceneGet(scene,'xyz');
whiteXYZ = sceneGet(scene,'illuminant xyz');
vcAddAndSelectObject(scene); sceneWindow
ans = 

  sceneWindow_App with properties:

                        figure1: [1×1 Figure]
                       FileMenu: [1×1 Menu]
                   menuFileLoad: [1×1 Menu]
                   menuFileSave: [1×1 Menu]
                  menuSaveImage: [1×1 Menu]
                menuFileRefresh: [1×1 Menu]
                  menuFileClose: [1×1 Menu]
                       menuEdit: [1×1 Menu]
              menuEditSceneName: [1×1 Menu]
               menuEditNewScene: [1×1 Menu]
                  menuCopyScene: [1×1 Menu]
                 menuEditDelete: [1×1 Menu]
             menuEditDeleteSome: [1×1 Menu]
                   menuSpectral: [1×1 Menu]
                     menuSPDdiv: [1×1 Menu]
                    menuSPDMult: [1×1 Menu]
          menuEditSetIlluminant: [1×1 Menu]
               menuResampleWave: [1×1 Menu]
       menuEditAdjustMonochrome: [1×1 Menu]
              menuEditTransform: [1×1 Menu]
              menuEditScaleSize: [1×1 Menu]
                       editCrop: [1×1 Menu]
              menuEditTranspose: [1×1 Menu]
                 menuEditRotate: [1×1 Menu]
                  menuEditRotCW: [1×1 Menu]
                 menuEditRotCCW: [1×1 Menu]
                   menuEditFlip: [1×1 Menu]
         menuEditFlipHorizontal: [1×1 Menu]
           menuEditFlipVertical: [1×1 Menu]
               menuEditFontSize: [1×1 Menu]
            menuEditClearWindow: [1×1 Menu]
                 menuEditViewer: [1×1 Menu]
                       PlotMenu: [1×1 Menu]
               menuPlotRadiance: [1×1 Menu]
              menuPlotRadianceE: [1×1 Menu]
              menuPlotRadImGrid: [1×1 Menu]
           menuPlotIllumPhotons: [1×1 Menu]
             menuPlotIlluminant: [1×1 Menu]
        menuPlotIlluminantImage: [1×1 Menu]
            menuPlotReflectance: [1×1 Menu]
             menuPlotImTrueSize: [1×1 Menu]
            menuPlotMultipleRGB: [1×1 Menu]
          menuPlotImageSpectral: [1×1 Menu]
                  menuPlotDepth: [1×1 Menu]
           menuPlotDepthContour: [1×1 Menu]
                      menuScene: [1×1 Menu]
               menuSceneMacbeth: [1×1 Menu]
       menuSceneMacbethTungsten: [1×1 Menu]
            menuSceneMacbethD50: [1×1 Menu]
            menuSceneMacbethD65: [1×1 Menu]
              menuSceneMacbethC: [1×1 Menu]
    menuSceneMacbethFluorescent: [1×1 Menu]
          menuSceneMacbethVisIR: [1×1 Menu]
                 menuSceneLstar: [1×1 Menu]
                 menuScenesTest: [1×1 Menu]
                menuScenesSweep: [1×1 Menu]
                   menuHarmonic: [1×1 Menu]
            menuSceneFreqOrient: [1×1 Menu]
            menuSceneSlantedBar: [1×1 Menu]
             menuSceneZonePlate: [1×1 Menu]
                menuSceneMackay: [1×1 Menu]
          menuSceneCheckerboard: [1×1 Menu]
            menuScenePointArray: [1×1 Menu]
             menuSceneGridLines: [1×1 Menu]
              menuSceneTestLine: [1×1 Menu]
           menuSceneRadialLines: [1×1 Menu]
                    menuUniform: [1×1 Menu]
         menuSceneUniformPhoton: [1×1 Menu]
             menuSceneUniformEE: [1×1 Menu]
                 menuUniformD65: [1×1 Menu]
      menuSceneUniformEESpecify: [1×1 Menu]
      menuSceneUniformBBspecify: [1×1 Menu]
                 menuScenesRamp: [1×1 Menu]
                 menuSceneNoise: [1×1 Menu]
                  menuSceneFile: [1×1 Menu]
             menuSceneMultiSpec: [1×1 Menu]
             menuSceneChooseRGB: [1×1 Menu]
         menuFileChooseFileMono: [1×1 Menu]
                         menuAn: [1×1 Menu]
                menuAnalyzeLine: [1×1 Menu]
               menuAnalyzeLineH: [1×1 Menu]
               menuAnalyzeLineV: [1×1 Menu]
               menuAnalyzeLFFTH: [1×1 Menu]
               menuAnalyzeLFFTv: [1×1 Menu]
            menuAnalyzeLineWave: [1×1 Menu]
                 menuAnalyzeLWH: [1×1 Menu]
                 menuAnalyzeLWV: [1×1 Menu]
                 menuAnalyzeROI: [1×1 Menu]
                  menuLuminance: [1×1 Menu]
        menuAnalyzeChromaticity: [1×1 Menu]
                  menPlotLumLin: [1×1 Menu]
                  PlotLuminance: [1×1 Menu]
            menuAnIlluminantCCT: [1×1 Menu]
                       menuHelp: [1×1 Menu]
       menuHelpSceneProgrammers: [1×1 Menu]
              menuHelpProgGuide: [1×1 Menu]
               menuHelpAppNotes: [1×1 Menu]
                        UITable: [1×1 Table]
                          Panel: [1×1 Panel]
                     txtMessage: [1×1 Label]
                        Panel_2: [1×1 Panel]
                    popupRender: [1×1 DropDown]
                         text21: [1×1 Label]
                txtDisplayGamma: [1×1 Label]
                      editGamma: [1×1 EditField]
                        btnPrev: [1×1 Button]
                        btnNext: [1×1 Button]
               popupSelectScene: [1×1 DropDown]
                     sceneImage: [1×1 UIAxes]
                 MoreinfoButton: [1×1 Button]
                 boxDescription: [1×1 ButtonGroup]
            txtSceneDescription: [1×1 Label]
                       boxScene: [1×1 ButtonGroup]
                           txtM: [1×1 Label]
                        txtDist: [1×1 Label]
                   editDistance: [1×1 EditField]
                         txtDeg: [1×1 Label]
                         txtFOV: [1×1 Label]
                     editHorFOV: [1×1 EditField]
                        txtCDM2: [1×1 Label]
                         txtLum: [1×1 Label]
                  editLuminance: [1×1 EditField]
                      imageMenu: [1×1 ContextMenu]
                 HorLumLineMenu: [1×1 Menu]
                    RefreshMenu: [1×1 Menu]

Convert to color blind appearance and then image as srgb

% Show color images in a window
vcNewGraphWin;
for cbType = 1:3
    lms =  xyz2lms(imgXYZ, cbType, whiteXYZ);
    cbXYZ = imageLinearTransform(lms, colorTransformMatrix('lms2xyz'));
    subplot(3,1,cbType), imagesc(xyz2srgb(cbXYZ)); axis image; axis off
end

To visualize where the values are in 3-space do this In general for the Brettell algorithm, the data are in a bi-plane, not a single plane. In this case, the biplane is onlyk visible for the tritan data, not the protan or deutan data.

vcNewGraphWin;
for cbType = 1:3
    lms =  xyz2lms(imgXYZ, cbType, whiteXYZ);
    cbXYZ = imageLinearTransform(lms, colorTransformMatrix('lms2xyz'));
    tmp = RGB2XWFormat(cbXYZ);
    subplot(3,1,cbType), plot3(tmp(:,1),tmp(:,2),tmp(:,3),'.'); grid on
end

Change the scene illumination

scene = sceneFromFile('StuffedAnimals_tungsten-hdrs.mat','multispectral');
imgXYZ   = sceneGet(scene,'xyz');
whiteXYZ = sceneGet(scene,'illuminant xyz');
% vcAddAndSelectObject(scene); sceneWindow

% Show color images in a window
vcNewGraphWin;
for cbType = 1:3
    lms =  xyz2lms(imgXYZ, cbType, whiteXYZ);
    cbXYZ = imageLinearTransform(lms, colorTransformMatrix('lms2xyz'));
    subplot(3,1,cbType), imagesc(xyz2srgb(cbXYZ)); axis image; axis off
end
Reading multispectral data with mcCOEF.
Saved using svd method
sFiles = cell(1,4);
sFiles{1} = which('MunsellSamples_Vhrel.mat');
sFiles{2} = which('Food_Vhrel.mat');
sFiles{3} = which('DupontPaintChip_Vhrel.mat');
sFiles{4} = which('HyspexSkinReflectance.mat');
%{
   sFiles{1} = fullfile(isetRootPath,'data','surfaces','reflectances','MunsellSamples_Vhrel.mat');
   sFiles{2} = fullfile(isetRootPath,'data','surfaces','reflectances','Food_Vhrel.mat');
   sFiles{3} = fullfile(isetRootPath,'data','surfaces','reflectances','DupontPaintChip_Vhrel.mat');
   sFiles{4} = fullfile(isetRootPath,'data','surfaces','reflectances','HyspexSkinReflectance.mat');
%}
sSamples = [12,12,25,25]*5; nSamples = sum(sSamples);
pSize = 24;

[scene, samples] = sceneReflectanceChart(sFiles,sSamples,pSize);
scene = sceneAdjustLuminance(scene,100);
vcAddAndSelectObject(scene); sceneWindow;

imgXYZ   = sceneGet(scene,'xyz');
whiteXYZ = sceneGet(scene,'illuminant xyz');

vcNewGraphWin;
for cbType = 1:3
    lms =  xyz2lms(imgXYZ, cbType, whiteXYZ);
    cbXYZ = imageLinearTransform(lms, colorTransformMatrix('lms2xyz'));
    subplot(3,1,cbType), imagesc(xyz2srgb(cbXYZ)); axis image; axis off
end

End