AutoRegisterSPOT4bandWebTilesetRef.sml

  Download

More scripts: Georeference

Syntax Highlighing:

comments, key words, predefined symbols, class members & methods, functions & classes
            
# AutoRegisterSPOT4bandWebTilesetRef.sml
# Demonstrates use of the IMAGE_PIPELINE_AUTOREGISTER
# class to automatically generate control points for
# an input image from a reference web tileset on the internet.
# The input image is 4-band SPOT stored as separate
# raster bands in a TNT Project File where
# Band 1 = Near-Infrared
# Band 2 = Red
# Band 3 = Green
# Band 4 = Mid-Infrared
# The Image can have its original nominal georeference, which is 
# automatically converted to control points by auto-register.
# The reference image is assumed to be a 24-bit RGB color-composite
# (natural color) stored as a web tileset on the internet.
# Band 3 of the SPOT (green) is matched to the "Green" component
# of the RGB composite reference image for auto-register.  The
# resulting georeference is saved to all input image bands.
# Includes status dialog that shows an auto-register progress bar.
# 18 March 2011
# requires TNTmips 2011, 9-Feb-2011 update or later.
# Randy Smith, MicroImages Inc.
numeric err;
# error checking procedure
proc ReportError(numeric linenum, numeric err) {
	printf("FAILED -line: %d, error: %d\n", linenum - 1, err);
	PopupError(err); 
	}
clear();  # clear the console
# choose image bands to auto-register
class STRING prompt$;
prompt$ = "Choose 4 SPOT MS bands:";
class RVC_OBJITEM inpObjItemList[];		# hash of RVC_OBJITEMs for selected raster objects
numeric numBands;
DlgGetObjects(prompt$, "Raster", inpObjItemList, "ExistingOnly");
numeric i;		# check ObjItem hash
for i = 1 to inpObjItemList.GetNumItems()
	{
	printf("Band %d = %s\n", i, inpObjItemList[i].GetObjectPath() );
	} 
# get URL for the web tileset to use for the reference
class STRING url$, default$;
default$ = "https://www.microimages.com/geodata/kappa/SD2010 GM state/SD2010 GM state.tsd";
prompt$ = "Enter or paste URL of web tileset reference:";
url$ = PopupString(prompt$, default$, "Web Tileset URL");
##########################################################
### Create status dialog and its context
##########################################################
class STATUSDIALOG statusD;		# status dialog to show process status
statusD.Create();
class STATUSCONTEXT statusC;		# context for the status dialog
statusC = statusD.CreateContext();
# create pipeline source for the single band of the input to use
# for Auto-Register; specify by 1-based index to the ObjItemList where 3 = Band 3 = green:
class IMAGE_PIPELINE_SOURCE_RVC inpSource(inpObjItemList[3]);
err = inpSource.Initialize();
if (err < 0) then ReportError(_context.CurrentLineNum, err);
else print("input source initialized");
# create pipeline source for the reference web tileset
class IMAGE_PIPELINE_SOURCE_TILESET refTileset(url$);
err = refTileset.Initialize();
if (err < 0) then ReportError(_context.CurrentLineNum, err);
else print("reference source initialized");
# filter to select the green component of the reference tileset
array numeric srcSamples[1];
srcSamples[1] = 2;  # index for green component 
class IMAGE_PIPELINE_FILTER_SELECT refTilesetGreen(refTileset, srcSamples, 1);
err = refTilesetGreen.Initialize();
if (err < 0) then ReportError(_context.CurrentLineNum, err);
else print("select filter for reference tileset initialized");
# set auto-register class parameters; CRS will be set automatically
# from the input image
print("Setting up auto-register...");
statusC.Message = "Setting up auto-register...";
class IMAGE_PIPELINE_AUTOREGISTER autoReg;
autoReg.SetAutoGenerateGCPs(1);		# set to auto-generate control points
autoReg.SetModel("PlaneProjective");	# set maximum model
autoReg.SetUseExistingGCPs(0, 0);	# use but don't adjust existing points (will be disabled when done)
autoReg.SetInitialAccuracy(20);		# 20 cells
autoReg.SetGCPSpacing(75);				# 75 cells
autoReg.SetMaxGCPResidual(2);			# 2 cells
autoReg.SetCorrPatchSize(128);		# 128 cells
autoReg.SetMaxModel("PolynomialOrder2");
# run auto-register
print("Parameters set, starting auto-register");
statusC.Message = "Running auto-register...";
autoReg.Run(inpSource, refTilesetGreen);
# get RMS XY residual and result model from the auto-register class
numeric resultRMS;
class STRING resultModel;
resultRMS = autoReg.GetResultRMSResidual();
resultModel = autoReg.GetResultModel();
printf("Result residual = %.2f\n", resultRMS);
printf("Result model = %s\n", resultModel);
# check the overall control point RMS and if it passes, save georeference to all
# of the inputs
if (resultRMS <= 1.5) 
	{
	print("residual less than cut-off, saving result");
	for i = 1 to inpObjItemList.GetNumItems()
		{
		autoReg.SaveGeoreference(inpObjItemList[i]);
		printf("saved georeference for input %d\n", i);
		}
	}
# set final status dialog message and destroy the dialog.
statusC.Message = "Script Ran to Completion";
statusD.Destroy();
print("Done");