PipelineContrastCompositeToTIFF.sml

  Download

More scripts: Raster

Syntax Highlighing:

comments, key words, predefined symbols, class members & methods, functions & classes
            
# PipelineContrastCompositeToTIFF.sml
# Sample standalone script to demonstrate an image pipeline application:
# applying contrast to three grayscale RVC source rasters and making an RGB composite GeoTIFF file.
# If any input grayscale raster does not have a contrast table, the script computes a standard
# contrast table for a temporary copy of this raster, then applies this contrast.
# 21 December 2007
# Requires Version 2007:73 or later of the TNT products.
numeric err;										# error value
# error checking procedure
proc ReportError(numeric linenum, numeric err) {
	printf("FAILED -line: %d, error: %d\n", linenum - 1, err);
	PopupError(err); 
	}
# procedure to compute standard contrast table for copy of input raster that has no contrast table
proc computeCon(class CONTRAST con, class RVC_RASTER Rast) {
	class RVC_OBJECT tempFile;
	class RVC_RASTER tempRast;
	# copy source raster to temporary file, then close source raster
	tempFile.MakeTempFile(1);
	Rast.CopyTo(tempFile, tempRast);
	Rast.Close();
	# open temporary raster and compute standard contrast table for it
	tempRast.OpenAttached("Write");
	con.ComputeStandard(tempRast, "normalize");
	Rast = tempRast;			# reassign temporary raster to original raster variable
	tempRast.Close();			# close temporary raster
	}
################################################################################
#################################  Main program  ###############################
clear();
# set context so script does not exit on error, allowing manual
# handling of errors (primarily used with CONTRAST class method
# to read a contrast table, which returns an error if no table exists).
_context.AbortOnError = 0;
# CHOOSE INPUT RASTERS
class RVC_RASTER Red, Green, Blue;			# input rasters to composite
class CONTRAST conRed, conGreen, conBlue;	# contrast class instance for each input raster
GetInputRaster(Red);
# check to ensure that first raster selected is a grayscale raster
if (Red.$Info.Type == "binary" or
	Red.$Info.Type == "16-bit color RGB" or
	Red.$Info.Type == "16-bit color BGR" or
	Red.$Info.Type == "24-bit color RGB" or
	Red.$Info.Type == "24-bit color BGR") 
	{
	print("Binary and composite rasters cannot be used as input for this script.  Exiting now.");
	Exit();
	}
err = conRed.Read(Red);							# read last-used contrast table into CONTRAST class
if ( err < 0) computeCon(conRed, Red);		# if none, call procedure to auto-contrast a copy of the raster
# get remaining input rasters, constrained to be the same type as Red 
GetInputRaster(Green, Red.$Info.NumLins, Red.$Info.NumCols, Red.$Info.Type);
err = conGreen.Read(Green);
if ( err < 0) computeCon(conGreen, Green);
GetInputRaster(Blue, Red.$Info.NumLins, Red.$Info.NumCols, Red.$Info.Type);
err = conBlue.Read(Blue);
if ( err < 0) computeCon(conBlue, Blue);
# Get filename and filepath for output TIFF file
print("Getting output file name.");
class STRING outFileName$ = GetOutputFileName("image", "Choose destination and name for output GeoTIFF file", ".tif");
class FILEPATH outFilePath(outFileName$);
printf("Output file path = %s\n", outFilePath);
# PIPELINE SOURCES: one for each color component
class IMAGE_PIPELINE_SOURCE_RVC source_Red(Red.GetObjItem() );
err = source_Red.Initialize();
if ( err < 0) 
	ReportError(_context.CurrentLineNum, err);
else
	print("Set red source.");
class IMAGE_PIPELINE_SOURCE_RVC source_Green(Green.GetObjItem() );
err = source_Green.Initialize();
if ( err < 0) 
	ReportError(_context.CurrentLineNum, err);
else
	print("Set green source.");
class IMAGE_PIPELINE_SOURCE_RVC source_Blue(Blue.GetObjItem() );
err = source_Blue.Initialize();
if ( err < 0) 
	ReportError(_context.CurrentLineNum, err);
else
	print("Set blue source.");
# PIPELINE FILTERS to apply lookup table (from contrast) to sources
# red component
class IMAGE_PIPELINE_FILTER_LOOKUP lookupRed (source_Red);
err = lookupRed.SetContrastParm(conRed);		# set CONTRAST class instance as lookup table
if ( err < 0) ReportError(_context.CurrentLineNum, err);
err = lookupRed.Initialize();
if ( err < 0) 
	ReportError(_context.CurrentLineNum, err);
else
	print("Initialized red contrast");
# green component
class IMAGE_PIPELINE_FILTER_LOOKUP lookupGreen (source_Green);
err = lookupGreen.SetContrastParm(conGreen);
if ( err < 0) ReportError(_context.CurrentLineNum, err);
err = lookupGreen.Initialize();
if ( err < 0) 
	ReportError(_context.CurrentLineNum, err);
else
	print("Initialized green contrast");
# blue component
class IMAGE_PIPELINE_FILTER_LOOKUP lookupBlue (source_Blue);
err = lookupBlue.SetContrastParm(conBlue);
if ( err < 0) ReportError(_context.CurrentLineNum, err);
err = lookupBlue.Initialize();
if ( err < 0) 
	ReportError(_context.CurrentLineNum, err);
else
	print("Initialized blue contrast");
# PIPELINE FILTER to make composite
# filter can accommodate different numbers of components, so it takes a STAGE_ARRAY of input stages
# (sources or previous filters; in this case, previous FILTER_LOOKUP stages
class IMAGE_PIPELINE_STAGE_ARRAY stages(lookupRed, lookupGreen, lookupBlue);
class IMAGE_PIPELINE_FILTER_COMPOSITE filter_comp(stages, "RGB");
err = filter_comp.Initialize();
if ( err < 0) 
	ReportError(_context.CurrentLineNum, err);
else
	print("Composite filter initialized.");
# PIPELINE TARGET
class IMAGE_PIPELINE_TARGET_TIFF target_comp_tif(filter_comp, outFilePath);
err = target_comp_tif.Initialize(); 
if ( err < 0) 
	ReportError(_context.CurrentLineNum, err);
else
	print("TIFF file initialized");
# EXECUTE the pipeline process
target_comp_tif.Process();
print("Done.");