Compressing hyperspectral data (hypercube)

Hyperspectral scene data (also called hypercube (HC)) can be quite large. The spectral functions in the data are typically smooth, and thus compressible.

Here, we use a linear model calculated from the singular value decomposition (svd) of the raw data to define spectral basis functions. We represent the image photons with respect to these spectral bases.

There are a number of functions that manage hyper-cube data. You can list these using

  doc('hypercube')

See also: hcBasis, scenePlot, sceneFromFile, ieSaveMultiSpectralImage, s_scene2ImageData, s_scene2SampledScene, s_renderScene,

Copyright ImagEval Consultants, LLC, 2012

Contents

ieInit

Read in the scene

fName = fullfile(isetRootPath,'data','images','multispectral','StuffedAnimals_tungsten-hdrs');
scene = sceneFromFile(fName,'multispectral');

% Have a look at the image
ieAddObject(scene); sceneWindow;

% Plot the illuminant
scenePlot(scene,'illuminant photons');
Reading multispectral data with mcCOEF.
Saved using svd method

Compress the hypercube requiring only 95% of the var explained

vExplained = 0.95;
[imgMean, imgBasis, coef] = hcBasis(sceneGet(scene,'photons'),vExplained);

Save the data

wave        = sceneGet(scene,'wave');
basis.basis = imgBasis;
basis.wave  = wave;

comment = 'Compressed using hcBasis with imgMean)';
illuminant = sceneGet(scene,'illuminant');
oFile = fullfile(isetRootPath,'deleteMe.mat');
ieSaveMultiSpectralImage(oFile,coef,basis,comment,imgMean,illuminant);

read in the data

wList = 400:5:700;
scene2 = sceneFromFile(oFile ,'multispectral',[],[],wList);

% This poor representation produces a very desaturated
% image
ieAddObject(scene2); sceneWindow;
Reading multispectral data with mcCOEF.
Saved using svd method

Now require that much more of the variance be explained

vExplained = 0.99;
[imgMean, imgBasis, coef] = hcBasis(sceneGet(scene,'photons'),vExplained);
fprintf('Number of basis functions %.0f\n',size(imgBasis,2));
Number of basis functions 3

Save the data

wave        = sceneGet(scene,'wave');
basis.basis = imgBasis;
basis.wave  = wave;

comment = 'Compressed using hcBasis with imgMean)';

illuminant = sceneGet(scene,'illuminant');
% illuminant.wavelength = scene.spectrum.wave;
% illuminant.data = scene.illuminant.data;
ieSaveMultiSpectralImage(oFile,coef,basis,comment,imgMean,illuminant);

read in the data

wList = 400:5:700;
scene2 = sceneFromFile(oFile ,'multispectral',[],[],wList);
ieAddObject(scene2); sceneWindow;
Reading multispectral data with mcCOEF.
Saved using svd method

Clean up the temporary file.

delete(oFile);