1
+ #function [SpecDist] = PlotSpectraDistribution(Spectra, WaveLengths,SampStuff, FigNum);
2
+ ###
3
+ ######################################################################
4
+ ### A FUNCTION THAT CREATES & DISPLAYS SPECTRA AS A 2D HISTOGRAM ###
5
+ ### SPECTRA ARE ASSUMED REFLECTANCES OR EMISSIVITIES IN [0,1] ###
6
+ ### SPECTRA ARE MAPPED TO INTEGERS BETWEEN 0 AND 100 (OR < 100) ###
7
+ ######################################################################
8
+ ###
9
+ ### INPUTS:
10
+ ### I1. Spectra IS A NUMBER SPECTRA x NUMBER BANDS... ###
11
+ ### ...ARRAY OF REFLECTANCES OR EMISSIVITIES ###
12
+ ### I2. WaveLengths IS A VECTOR OF THE SPECTRAL WAVELENGTHS ###
13
+ ### I3. SampStuff IS A VECTOR CONTAINING ###
14
+ ### SampInt: FRACTIONAL SIZE OF HISTOGRAM BINS ###
15
+ ### IntSampInt: INT VERSION OF SampInt ###
16
+ ### IntTopReflect: INT VALUE OF MAX REF/EMIS BIN ###
17
+ ### I4. FigNum IS THE INDEX OF THE FIGURE TO USE FOR DISPLAY ###
18
+ ### IF FigNum < 1, DO NOT DISPLAY ANYTHING ###
19
+ ###
20
+ ### OUTPUTS:
21
+ ### O1. SpecDist IS THE 2D HISTOGRAM ###
22
+ ##################################################################
23
+ ### ###
24
+ ### MATLAB AUTHOR: Darth Gader ###
25
+ ### PYTHON AUTHOR: Ron Fick ###
26
+ ### LAST UPDATE: 021519 ###
27
+ ### ###
28
+ ##################################################################
29
+ def PlotSpectraDistribution (Spectra , WaveLengths , SampStuff , FigNum ):
30
+
31
+ import numpy as np
32
+ from scipy import signal
33
+ import cv2
34
+ import matplotlib .pyplot as plt
35
+ from mpl_toolkits .mplot3d import Axes3D
36
+ from matplotlib import cm
37
+
38
+ ##
39
+ ### INITIALIZE PARAMETERS ###
40
+
41
+ SampInt = SampStuff [0 ]
42
+ IntSampInt = SampStuff [1 ]
43
+ IntTopReflect = SampStuff [2 ]
44
+ SMOOTHSIZE = [3 ,3 ]
45
+ NumWave = np .size (Spectra , 1 )
46
+ SpecDist = np .zeros ((IntTopReflect , NumWave ))
47
+ assert NumWave == np .size (WaveLengths ), 'Wavelength sizes don' 't match'
48
+
49
+ ### MAP SPECTRA TO [0, 100] ###
50
+ MappedSpectra = np .minimum (100 , (Spectra * 99 )+ 1 )
51
+ MappedSpectra = np .maximum (1 , np .round (MappedSpectra / SampInt )* SampInt )
52
+
53
+ ##
54
+ ### MAKE A HISTOGRAM FOR EACH WAVELENGTH ###
55
+ for k in range (NumWave ):
56
+ SpecDist [:, k ] = np .histogram (MappedSpectra [:, k ], np .arange (0 , IntTopReflect + IntSampInt , IntSampInt ))[0 ]
57
+
58
+ ### SMOOTH BY TAKING A LOCAL MAX FOLLOWED BY A LOCAL AVERAGE ###
59
+ SpecDist = cv2 .dilate (SpecDist , np .ones ((3 ,3 )), iterations = 1 )
60
+ SpecDist = signal .convolve2d (SpecDist , (1 / np .prod (SMOOTHSIZE ))* np .ones (SMOOTHSIZE ), 'same' )
61
+
62
+ ##
63
+ ### DISPLAY AS MESH ###
64
+ if (FigNum > 0 ):
65
+ XAxis = WaveLengths ;
66
+ YAxis = np .arange (0 , IntTopReflect , IntSampInt ).T
67
+ X , Y = np .meshgrid (XAxis , YAxis )
68
+ fig = plt .figure (FigNum )
69
+ ax = fig .gca (projection = '3d' )
70
+ surf = ax .plot_surface (X , Y , SpecDist , cmap = cm .coolwarm , linewidth = 0 , antialiased = False )
71
+ fig .colorbar (surf , shrink = 0.5 , aspect = 5 )
72
+ plt .title ('Spectra Histogram' )
73
+ plt .xlabel ('Wavelength (nm)' )
74
+ plt .ylabel ('Reflectance' )
75
+ plt .show ()
76
+
77
+ ### END OF FUNCTION ###
78
+ #######################
0 commit comments