This task performs Linear Spectral Unmixing, which determines the relative abundance of materials that are depicted in multispectral or hyperspectral imagery based on the endmembers’ spectral signatures. See Linear Spectral Unmixing for details.
Example
This example performs Linear Spectral Unmixing on an AVIRIS hyperspectral image, using mineral endmembers from a spectral library. The resulting image contains six bands. The first five bands are abundance images for each spectral endmember. The sixth band is an RSM error image. The pixel values of the abundance images indicate the fraction of the pixel that contains the corresponding endmember material.
PRO ENVILinearSpectralUnmixingTaskExample
COMPILE_OPT IDL2
e = ENVI()
File = Filepath('cup95eff.int', Subdir=['classic', 'data'], $
Root_Dir=e.Root_Dir)
Raster = e.OpenRaster(File)
SpecLibFile = Filepath('minerals_beckman_3375.sli', $
Subdir=['resource', 'speclib', 'usgs'], $
Root_Dir=e.Root_Dir)
SpecLib = ENVISpectralLibrary(SpecLibFile)
Metadata = Raster.Metadata
nBands = Raster.NBands
IF (Metadata.Tags.HasValue('REFLECTANCE SCALE FACTOR')) THEN BEGIN
scaleFactor = Metadata['REFLECTANCE SCALE FACTOR']
GainOffsetTask = ENVITask('ApplyGainOffset')
gains = Make_Array(nBands, VALUE=1D/scaleFactor, /DOUBLE)
offsets = Make_Array(nBands, VALUE=0D, /DOUBLE)
GainOffsetTask.INPUT_RASTER = raster
GainOffsetTask.GAIN = gains
GainOffsetTask.OFFSET = offsets
GainOffsetTask.Execute
Raster = GainOffsetTask.OUTPUT_RASTER
ENDIF
endmemberNames = ['Alunite GDS84 Na03 [W1R1Ba AREF]', $
'Kaolinite CM9 [W1R1Bb AREF]', $
'Calcite CO2004 [W1R1Bb AREF]', $
'Buddingtonite GDS85 D-206 [W1R1Bb AREF]', $
'Muscovite GDS107 [W1R1Ba AREF]']
nEndmembers = N_Elements(endmemberNames)
endmembers = DblArr(Raster.NBands, nEndmembers, /NOZERO)
FOR i=0, nEndmembers-1 DO BEGIN
SpecTask = ENVITask('GetSpectrumFromLibrary')
SpecTask.INPUT_SPECTRAL_LIBRARY = SpecLib
SpecTask.SPECTRUM_NAME = endmemberNames[i]
SpecTask.Execute
ResampleTask = ENVITask('ResampleSpectrum')
ResampleTask.INPUT_SPECTRUM = SpecTask.SPECTRUM
ResampleTask.INPUT_WAVELENGTHS = SpecTask.WAVELENGTHS
ResampleTask.INPUT_WAVELENGTH_UNITS = SpecTask.WAVELENGTH_UNITS
ResampleTask.RESAMPLE_WAVELENGTHS = Metadata['WAVELENGTH']
ResampleTask.RESAMPLE_WAVELENGTH_UNITS = Metadata['WAVELENGTH UNITS']
ResampleTask.Execute
endmembers[0, i] = ResampleTask.OUTPUT_SPECTRUM
ENDFOR
Task = ENVITask('LinearSpectralUnmixing')
Task.INPUT_RASTER = Raster
Task.ENDMEMBERS = endmembers
Task.NAMES = endmemberNames
Task.WEIGHT = 0.0
Task.Execute
DataColl = e.Data
DataColl.Add, Task.OUTPUT_RASTER
View = e.GetView()
Layer = View.CreateLayer(Task.OUTPUT_RASTER)
END
See More Examples below.
Syntax
Result = ENVITask('LinearSpectralUnmixing')
Input properties (Set, Get): ENDMEMBERS, INPUT_RASTER, NAMES, OUTPUT_RASTER_URI, WEIGHT
Output properties (Get only): OUTPUT_RASTER
Properties marked as "Set" are those that you can set to specific values. You can also retrieve their current values any time. Properties marked as "Get" are those whose values you can retrieve but not set.
Methods
This task inherits the following methods from ENVITask:
AddParameter
Execute
Parameter
ParameterNames
RemoveParameter
Properties
This task inherits the following properties from ENVITask:
COMMUTE_ON_DOWNSAMPLE
COMMUTE_ON_SUBSET
DESCRIPTION
DISPLAY_NAME
NAME
REVISION
TAGS
This task also contains the following properties:
ENDMEMBERS (required)
Specify a floating-point array with the spectral endmembers. The array size is [number of bands, number of endmembers]. You can select endmember spectra from different sources such as ASCII spectra, spectral libraries, spectral plots, statistics files, and regions of interest (ROIs).
INPUT_RASTER (required)
Specify a raster on which to perform Linear Spectral Unmixing.
NAMES (required)
Specify an array of endmember names. The array size must be [number of endmembers].
OUTPUT_RASTER
This is a reference to the output raster of filetype ENVI.
The output raster consists of bands that represent the relative abundance of features (0 to 1, one for each input endmember), plus an additional band of RMS Error values.
OUTPUT_RASTER_URI (optional)
Specify a string with the fully qualified filename and path of the associated OUTPUT_RASTER. If you do not specify this property, or set it to an exclamation symbol (!), a temporary file will be created.
WEIGHT (optional)
Specify a weight when applying a unit sum constraint. Larger weights cause the unmixing to honor the unit-sum constraint more closely. The default value is 1.0.
More Examples
This example performs Linear Spectral Unmixing on an AVIRIS hyperspectral image, using an ASCII file of spectral endmembers.
The example uses sample images that are available from our ENVI Tutorials web page. Click the Hyperspectral link to download the .zip file to your machine, then unzip the files. Update the file location with your own directory.
e = ENVI()
File = 'mof94av.bil'
Raster = e.OpenRaster(File)
EndmemberFile = 'm94_em.asc'
Data = Read_ASCII(EndmemberFile, DATA_START=21)
Endmember = Transpose(Data.Field01[1:*,*])
Task = ENVITask('LinearSpectralUnmixing')
Task.INPUT_RASTER = Raster
Task.ENDMEMBERS = Endmember
Task.OUTPUT_RASTER_URI = e.GetTemporaryFilename()
Task.Execute
DataColl = e.Data
DataColl.Add, Task.Output_Raster
View1 = e.GetView()
Layer1 = View1.CreateLayer(Task.Output_Raster)
Version History
ENVI 5.4.1 |
Introduced |
ENVI 6.0 |
Added the NAMES property |
API Version
4.3
See Also
ENVITask