Syntax Highlighing:
comments, key words, predefined symbols, class members & methods, functions & classes
# VB_PanSharp.xml
# Sample script that illustrates the use of a complex custom
# dialog window constructed using Visual Basic and registered
# as an ActiveX component class. The Visual Basic
# class VBform is imported by the SML script, so its
# class members are available to SML, and callback
# procedures in the SML script can be bound to the relevant
# controls on the Visual Basic dialog.
# This is a Visual Basic version of the script pansharpcomp.sml.
# Both scripts compute a pan-sharpened color-composite
# image from three bands of a multispectral image and a
# higher-resolution panchromatic image.
# If the Apply Contrast option is selected for an input raster,
# the last-used contrast table is used to make a contrast-adjusted
# temporary raster for further processing. Perform necessary
# contrast enhancements for the input rasters and save contrast
# tables before running the script.
# This script requires TNTmips 7.3 or later on a computer running Windows98,
# Windows2000, or later Windows OS.
# The ActiveX component imported by this script can be downloaded from
# https://www.microimages.com/downloads/smlscripts.htm. The ActiveX
# component must be registered first by running the Setup program in the
# Package subdirectory of the VB_PanSharp directory.
# Jeremy Johnson
# MicroImages, Inc.
# 1 March 2004
# revised 4 January 2010.
##################################################################
###
### use preprocessor command to "import" the Visual Basic ActiveX
### component class VBform. Note that preprocessor command lines
### must NOT end in a semicolon (;).
###
##################################################################
$import VB_PanSharp.VBForm
###################################################################
########## Global Class Declarations ##############################
###################################################################
class VBForm form;
###################################################################
########## Global Variable Declarations ###########################
###################################################################
numeric ret; # value returned by the class method that opens dialog
numeric numlinsP; # number of lines in panchromatic raster
numeric numcolsP; # number of columns in panchromatic raster
class STRING datatypeP$; # data type of panchromatic raster
class RVC_RASTER RedCon, GreenCon, BlueCon, PanCon; # temporary rasters for
# contrast-enhanced bands
class RVC_RASTER RedRsp, GreenRsp, BlueRsp; # temporary rasters for resampled
# RGB components
class STRING method$; # color blending method from dialog listbox;
### variables for color conversion
class RVC_RASTER RedSharp, GreenSharp, BlueSharp; # temporary rasters for pan-sharpened color components
numeric r, g, b, p; # values of red, green, blue, and pan components for current cell
numeric h, i, s; # values of hue, intensity, and saturation for current cell (from r, g, b)
numeric br; # brightness value for current cell in HBS color model (from r, g, b)
numeric scale; # scale factor for Brovey transform
### variables for color composite
numeric bdepth; # desired bit depth of output composite from dialog: 24, 16, or 8
numeric depth;
string compdatatype$; # string with datatype of composite raster
class RVC_RASTER Comp; # output raster for color composite
numeric compobjnum; # object number of output composite raster
class STRING compfilename$; # filename, object name, and object descriptions
class STRING compobjname$; # for output composite raster
class STRING compobjdescr$;
numeric conred, congreen, conblue, conpan; #for application of contrast options
##########################################
# procedure to select band and write its filename / object name
# to the dialog (in edittext field)
##########################################
proc GetBand(class RVC_RASTER Band, string id$) {
local class STRING filename$, objname$, dlgtext$;
local numeric objnum;
GetInputRaster( Band, 0, 0, "8-bit unsigned" );
filename$ = GetObjectFileName( Band );
objnum = GetObjectNumber( Band );
objname$ = GetObjectName( filename$, objnum );
dlgtext$ = sprintf( "%s.%s / %s", FileNameGetName(filename$), FileNameGetExt(filename$), objname$ );
if (id$ == "rname") {
form.RedName = dlgtext$;
} else if (id$ == "gname") {
form.GreenName = dlgtext$;
} else if (id$ == "bname") {
form.BlueName = dlgtext$;
} else if (id$ == "pname") {
form.PanName = dlgtext$;
}
} # end proc GetBand()
###########################################
# callback procedure for the Red... pushbutton; prompts user to
# select the Red color component
###########################################
func SelectRed () {
class RVC_RASTER Red;
GetBand( Red, "rname" );
form.RedSelected();
} # end proc SelectRed()
###############################################
# callback procedure for the Green... pushbutton; prompts user to
# select the Green color component
###############################################
func SelectGreen () {
class RVC_RASTER Green;
GetBand( Green, "gname" );
form.GreenSelected();
} # end proc SelectGreen()
###############################################
# callback procedure for the Blue... pushbutton; prompts user to
# select the Blue color component
###############################################
func SelectBlue () {
class RVC_RASTER Blue;
GetBand( Blue, "bname" );
form.BlueSelected();
} # end proc SelectBlue()
################################################
# callback procedure for the Intensity... pushbutton; prompts user to
# select the Intensity component
################################################
func SelectPan () {
class RVC_RASTER Pan;
GetBand( Pan, "pname" );
form.PanSelected();
} # end proc SelectPan()
##################################################
#Function to get the values stored in the form
###################################################
func GetValues() {
depth = form.depth;
conred = form.conred;
congreen = form.congreen;
conblue = form.conblue;
conpan = form.conpan;
method$ = form.method;
form.CloseForm();
}
#########################
# Bind form events to SML functions
#########################
form.SetOnbtnRed(SelectRed);
form.SetOnbtnBlue(SelectBlue);
form.SetOnbtnGreen(SelectGreen);
form.SetOnbtnPan(SelectPan);
form.SetOnbtnOK(GetValues);
##########################
# Display the Dialog (modal)
##########################
form.ShowDialog();
#################################################
### Get the output raster for the composite
#################################################
### Get setting for composite bit-depth
### Taken from the form's combobox
### an index value of 1 indicates 24-bit
### an index value of 2 indicates 16-bit
if ( depth == 1 ) {
compdatatype$ = "24-bit color RGB";
bdepth = 24;
} else {
compdatatype$ = "16-bit color RGB";
bdepth = 16;
}
### Get the output raster
numlinsP = NumLins( Pan );
numcolsP = NumCols( Pan );
GetOutputRaster( Comp, numlinsP, numcolsP, compdatatype$ );
##############################################
### apply contrast tables if requested
##############################################
printf( "Applying contrast if requested...\n\n" );
datatypeP$ = RastType( Pan );
CreateTempRaster( RedCon, NumLins( Red ), NumCols( Red ), RastType( Red ) );
CreateTempRaster( GreenCon, NumLins( Green ), NumCols( Green ), RastType( Green ) );
CreateTempRaster( BlueCon, NumLins( Blue ), NumCols( Blue ), RastType( Blue ) );
CreateTempRaster( PanCon, numlinsP, numcolsP, datatypeP$ );
if (conred == 1 ) then
RasterApplyContrast2( Red, RedCon, "Subobject" );
else {
RedCon = Red;
CopySubobjects(Red, RedCon, "GEOREF" );
}
if (congreen == 1 ) then
RasterApplyContrast2( Green, GreenCon, "Subobject" );
else {
GreenCon = Green;
CopySubobjects( Green, GreenCon, "GEOREF" );
}
if (conblue == 1 ) then
RasterApplyContrast2( Blue, BlueCon, "Subobject" );
else {
BlueCon = Blue;
CopySubobjects( Blue, BlueCon, "GEOREF" );
}
if (conpan == 1 ) then
RasterApplyContrast2( Pan, PanCon, "Subobject" );
else {
PanCon = Pan;
CopySubobjects( Pan, PanCon, "GEOREF" );
}
###################################################
### resample RGB rasters to match the Panchromatic band
###################################################
printf( "Resampling RGB rasters to match Pan... \n\n" );
# create temporary rasters for resampled RedCon, GreenCon, and BlueCon
CreateTempRaster( RedRsp, numlinsP, numcolsP, datatypeP$ );
CreateTempRaster( GreenRsp, numlinsP, numcolsP, datatypeP$ );
CreateTempRaster( BlueRsp, numlinsP, numcolsP, datatypeP$ );
ResampleRasterToMatch( RedCon, Pan, RedRsp, "planeproj", "bilinear" );
ResampleRasterToMatch( GreenCon, Pan, GreenRsp, "planeproj", "bilinear" );
ResampleRasterToMatch( BlueCon, Pan, BlueRsp, "planeproj", "bilinear" );
DeleteTempRaster( RedCon ); # delete the temporary rasters for contrast-enhanced
DeleteTempRaster( GreenCon ); # RGB bands
DeleteTempRaster( BlueCon );
###############################################
### Do the color adjustments to make sharpened
### red, green, and blue components
###############################################
printf( "Performing color conversion...\n\n" );
CreateTempRaster( RedSharp, numlinsP, numcolsP, datatypeP$ );
CreateTempRaster( GreenSharp, numlinsP, numcolsP, datatypeP$ );
CreateTempRaster( BlueSharp, numlinsP, numcolsP, datatypeP$ );
### check dialog settings for selected color conversion method
if ( method$ == "HIS" ) { # convert RGB to HIS, swap P for I,
# then convert back to RGB
for each RedRsp {
r = RedRsp;
g = GreenRsp;
b = BlueRsp;
p = PanCon / 2.55; # scales to intensity range 0-100
# expected by color conversion functions
ConvertRGBtoHIS( 254, r, g, b, h, i, s );
ConvertHIStoRGB( 254, h, p, s, r, g, b );
RedSharp = r;
GreenSharp = g;
BlueSharp = b;
}
}
else if (method$ == "HBS" ) { # convert RGB to HBS, swap P for Brightness,
# then convert back to RGB
for each RedRsp {
r = RedRsp;
g = GreenRsp;
b = BlueRsp;
p = PanCon / 2.55; # scales to intensity range 0-100
# expected by color conversion functions
ConvertRGBtoHBS( r, g, b, h, br, s );
ConvertHBStoRGB( h, p, s, r, g, b );
RedSharp = r;
GreenSharp = g;
BlueSharp = b;
}
}
else { # do Brovey transform
for each RedRsp {
r = RedRsp;
g = GreenRsp;
b = BlueRsp;
p = PanCon;
scale = 3 * p / ( r + g + b + 1 );
RedSharp = r * scale;
GreenSharp = g * scale;
BlueSharp = b * scale;
}
}
DeleteTempRaster( RedRsp );
DeleteTempRaster( GreenRsp );
DeleteTempRaster( BlueRsp );
###############################################
### Make the output composite
###############################################
printf( "Making the output composite...\n\n" );
#########
### Get info on the output raster for composite
compfilename$ = GetObjectFileName( Comp );
compobjnum = GetObjectNumber( Comp );
compobjname$ = GetObjectName( compfilename$, compobjnum );
compobjdescr$ = GetObjectDescription( compfilename$, compobjnum );
# Delete the Comp object because the stupid RasterRGBToComposite
# function wants to make its own; we will just use the names
# obtained from the GetOutputRaster dialog
DeleteObject( compfilename$, compobjnum );
###################
### Make output composite
RasterRGBToComposite( RedSharp, GreenSharp, BlueSharp, Comp, compfilename$, compobjname$, compobjdescr$, bdepth );
CopySubobjects(Pan, Comp, "GEOREF");
CreatePyramid(Comp);
printf( "Done." );