This task performs a type of image change detection known as spectral angle difference. It determines the spectral similarity between the Time 1 image spectra and the Time 2 image spectra for every pixel. Each pixel spectrum is represented by a vector in space whose dimensionality is equal to the number of bands. The task calculates the angle between the two vectors. The smaller the angle, the more similar the two spectra.
Before running this task, ensure that the two input images have the same number of bands and the same spatial dimensions. Use the BANDS property to the SubsetRaster task to define spectral subsets, if needed. Also use the ImageIntersection task to ensure that the two images have the same dimensions, projection, and pixel size.
Example
This example performs a SAM image difference change detection on two co-registered Sentinel-2 multispectral images. The images are before and after a flood event along the Mala River in Peru in 2017. They have the same number of bands, columns, and rows; no preprocessing is necessary.
The source files are available from our ENVI Tutorials web page. Click the Change Detection link to download the .zip file to your machine, then unzip the files. Update the file references in the example with the correct locations.
e = ENVI()
File1 = 'MalaRiver_2017-02-20.dat'
Raster1 = e.OpenRaster(File1)
File2 = 'MalaRiver_2017-03-12.dat'
Raster2 = e.OpenRaster(File2)
Task = ENVITask('SAMImageDifference')
Task.INPUT_RASTER1 = Raster1
Task.INPUT_RASTER2 = Raster2
Task.Execute
DataColl = e.Data
DataColl.Add, Task.OUTPUT_RASTER
View = e.GetView()
Layer = View.CreateLayer(Task.OUTPUT_RASTER)
See More Examples below.
Syntax
Result = ENVITask('SAMImageDifference')
Input properties (Set, Get): INPUT_RASTER1, INPUT_RASTER2, OUTPUT_RASTER_URI
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:
INPUT_RASTER1 (required)
Specify a multiband raster representing the earliest time.
INPUT_RASTER2 (required)
Specify a multiband raster representing the latest time.
OUTPUT_RASTER
This is a reference to the output raster of filetype ENVI.
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, the associated OUTPUT_RASTER will not be created. To force the creation of a temporary file set the property to an exclamation symbol (!).
More Examples
This example performs a SAM image difference change detection between a Landsat TM image from 1985 and a Landsat 8 image from 2020. It shows the effects of urban sprawl in Las Vegas, Nevada over a 35-year period. Because the number of bands is different between the two images, the example uses the SubsetRaster task to create a spectral subset of the Landsat 8 image. The example also uses the ImageIntersection task to ensure that the two images cover the same geographic extent and that they have the same spatial dimensions.
The source files are available from our ENVI Tutorials web page. Click the Landsat Case Studies link to download the .zip file to your machine, then unzip the files. Update the file references in the example with the correct locations.
e = ENVI()
File1 = 'LasVegasMay1985.dat'
Raster1 = e.OpenRaster(File1)
File2 = 'LasVegasMay2020.dat'
Raster2 = e.OpenRaster(File2)
Time2SubsetTask = ENVITask('SubsetRaster')
Time2SubsetTask.INPUT_RASTER = Raster2
Time2SubsetTask.BANDS = [1,2,3,4,5,6]
Time2SubsetTask.Execute
ImageIntersectionTask = ENVITask('ImageIntersection')
ImageIntersectionTask.INPUT_RASTER1 = Raster1
ImageIntersectionTask.INPUT_RASTER2 = Time2SubsetTask.OUTPUT_RASTER
ImageIntersectionTask.Execute
Task = ENVITask('SAMImageDifference')
Task.INPUT_RASTER1 = ImageIntersectionTask.OUTPUT_RASTER1
Task.INPUT_RASTER2 = ImageIntersectionTask.OUTPUT_RASTER2
Task.OUTPUT_RASTER_URI = e.GetTemporaryFilename()
Task.Execute
DataColl = e.Data
DataColl.Add, Task.OUTPUT_RASTER
View = e.GetView()
Layer = View.CreateLayer(Task.OUTPUT_RASTER)
View.Zoom, 0.4
Version History
API Version
4.3
See Also
ENVITask, ImageBandDifference Task, SubsetRaster Task, ImageIntersection Task