# [Matlab] Hyperspectral Data To RGB

hyper2rgb.m

clc; clear all; close all %Loads a directory with files in the format /<wavelength>.tif cube_dirname = 'C:YOUR-FOLDER-WITH-FILES'; cube_dir = dir([cube_dirname '*.tif']); %Load the data that relates spectral data to the x,y,z and energy primaries %Through the strings, choose the correct data. [lambda, xFcn, yFcn, zFcn, energy] = getSpectral('cie_1964','D65'); dummyim = imread([ cube_dirname cube_dir(end).name ]); hypercube = uint8(zeros(size(dummyim,1), size(dummyim,2), length(cube_dirname))); lambda_cube = zeros(length(cube_dir),1); for i=1:length(cube_dir) lambdaNow = cube_dir(i).name; lambdaNow = lambdaNow(1:3); disp(lambdaNow) hypercube(:,:,i) = imread([cube_dirname cube_dir(i).name]); lambda_cube(i) = str2num(lambdaNow); end for i=1:length(lambda_cube) idxS = find(lambda==lambda_cube(i),1); if isempty(idxS) xFcnCor(i) = 0; yFcnCor(i) = 0; zFcnCor(i) = 0; else xFcnCor(i) = xFcn(idxS); yFcnCor(i) = yFcn(idxS); zFcnCor(i) = zFcn(idxS); end idxI = find(lambda==lambda_cube(i),1); if isempty(idxS) energyCor(i) = 0; else energyCor(i) = energy(idxI); end end %Compute the normalisation factor k k=100./sum(yFcnCor.*energyCor); %Precompute the SPD's in the eye xI = xFcnCor.*energyCor; yI = yFcnCor.*energyCor; zI = zFcnCor.*energyCor; %Now synthesize the data, hard to do efficiently due to memory magement.. X=zeros(size(dummyim)); Y=zeros(size(dummyim)); Z=zeros(size(dummyim)); for x=1:size(dummyim,2) for y=1:size(dummyim,1) r=double(reshape(hypercube(y,x,:),1,length(xI)))./255; %reflectance value at (x,y) X(y,x) = sum(xI.*r); Y(y,x) = sum(yI.*r); Z(y,x) = sum(zI.*r); end end XYZ(:,:,1)=X; XYZ(:,:,2)=Y; XYZ(:,:,3)=Z; %Normalize XYZ = k*XYZ./100; C = makecform('XYZ2Lab'); Lab = applycform(XYZ,C); Lab16 = uint16(Lab./100.*((2^16)-1)); C = makecform('XYZ2srgb'); sRGB = applycform(XYZ,C); %Write to TIFF (in the format that Photoshop can read the L,a,b channels) imwrite(Lab16(:,:,1),'L.tif') imwrite(Lab16(:,:,2)./2+((2^16)/2),'a.tif') imwrite(Lab16(:,:,3)./2+((2^16)/2),'b.tif') imwrite(sRGB,'sRGB.tif') imshow(sRGB) %% Makes a 2D histogram style image of wavelength versus intensity of the spectral map clear hypercubeSmall for i=1:length(cube_dir) hypercubeSmall(:,:,i) = imresize(imread([cube_dirname cube_dir(i).name]),0.5); end %The vector 'lambda_cube' contains all the lambda elements clear vec vech for i=1:length(cube_dir) vec(i,:) = reshape(hypercubeSmall(:,:,i), 1, size(hypercubeSmall,1)*size(hypercubeSmall,2)); h=hist(double(vec(i,:)),[0:1:255]); vech(1:256,i)=h; end vech=flipud(vech*(2^16-1)/max2(vech)); imagesc(vech) %imwrite(uint16(vech),'binnedspectrum.tif')

## getSpectral.m

### Warning: this function is too long, as it contains some standardized spectral data. please download it from me. or below

function [lambda, x, y, z, energy] = getSpectral(formulary, illuminant) %getSpectral returs lambd versus x y z primaries and illumination back % with the colormatching function and illuminant name as input % [lambda, x, y, z, illum] = getSpectral(formulary, illum) % f.e. [lambda, x, y, z, energy] = getSpectral('cie_1964','D65') % % (c) Tim Zaman 2013 % Obtained from CIE spreadsheet and http://cvrl.ioo.ucl.ac.uk/ % (...)

dear sir

I have some hyperspectral data as below and I want to use in matlab how can I used them with matlab?.

source:http://www.spectir.com/

Deepwater Horizon Oil Spill Sample: June 06, 2010

0612-1615_igm_sub.hdr

0612-1615_rad_sub

Thanks for your help

Hashemizadeh

student of M.S. communication university

dear sir

I have some hyperspectral data as below and I want to use in matlab how can I used them with matlab?.

source:http://www.spectir.com/

Deepwater Horizon Oil Spill Sample: June 06, 2010

0612-1615_igm_sub.hdr

0612-1615_rad_sub

Thanks for your help

Hashemizadeh

student of M.S. communication university

Hi,

how can I get your getSpectral.m function?

Thank you

Fixed the post, you can now download it.

Can you please explain the physics behind doing all this?/ Question’s are:

Why can’t picking up three channels( from R, G, B ranges) from spectral data form an RGB image, or please point to some article which can help understand the physics

Thanks very much