# ------------------------------------------------------------ # WATER.sml # ------------------------------------------------------------ # SET WARNING LEVEL: $warnings 3 # ------------------------------------------------------------ # DEFINE PROCEDURE writeTitle: # PURPOSE: WRITES TITLE & AUTHOR INFO TO CONSOLE WINDOW. proc writeTitle() begin printf("WATER.sml:\n"); printf(" VERSION: November 15, 2005\n"); printf(" PURPOSE: MAKE A MERGED WATER & "); printf("LAND IMAGE.\n"); printf(" DETAILS: FAQs_by_Jack G\n"); printf(" AUTHOR: Dr. Jack F. Paris\n"); printf(" CONTACT INFO: jparis37@msn.com "); printf(" 303-775-1195\n"); printf(" ALLOWED USE: ONLY NON-COMMERCIAL\n\n"); end # ------------------------------------------------------------ # DECLARE VARIABLES: numeric nlins,ncols; numeric m,d,tLP,v,nc,wm,pW,pL,x,y,yt,facBL,offNA; numeric sBL_8,sGL_8,sRL_8,sNA_8; numeric srfiBL,srfiNA; array sBL_8[65536],sGL_8[65536],sRL_8[65536],sNA_8[65536]; numeric i,mini,srfiBLmaxW,srfiGLmaxW,srfiRLmaxW; numeric srfiBLmaxL,srfiGLmaxL,srfiRLmaxL,srfiNAmaxL; numeric redderW,brighterW,brightenDarkW; numeric redderL,brighterL,brightenDarkL; numeric pW,pL; string stype$; raster SRFIBL,SRFIGL,SRFIRL,SRFINA,WATERMASK; raster IMAGE; numeric iB,iG,iR,fB,fG,fR,fCLR; # ------------------------------------------------------------ # DEFINE VALUES FOR fR, and fG: fR = 2^16; fG = 2^8; fB = 1; # ------------------------------------------------------------ # DEFINE STRING VARIABLES FOR POPUP WINDOWS: string t$,p$,p1$,p2$,p3$,p4$,p5$,p6$,p7$,p8$,p9$; string p10$,p11$,p12$,p13$,p14$,p15$,p16$,p17$,p18$,p19$; string p20$,p21$; # ------------------------------------------------------------ # CLEAR CONSOLE WINDOW & REQUEST REPOSITIONING: p1$ = "CONSOLE-WINDOW ADJUSTMENT:\n"; p2$ = "* REPOSITION the CONSOLE WINDOW.\n"; p3$ = "* Then, CLICK OK."; p$ = p1$ + p2$ + p3$; PopupMessage(p$); # ------------------------------------------------------------ # DEFINE proc checkHisto(Band) # PURPOSE: Check that Input Raster has a Full (Unsampled) # Histogram. If Not, Then Recompute Histogram. proc checkHisto (raster Band) begin local numeric sampleInt; sampleInt = HistogramGetSampleInterval(Band); if (sampleInt > 1) begin DeleteHistogram(Band); CreateHistogram(Band,0); end else if (sampleInt == -1) then begin CreateHistogram(Band,0); end end # ------------------------------------------------------------ # USER INPUTS: # ENHANCEDMENT DEFAULTS: redderW = 1.18; brighterW = 1.00; brightenDarkW = 1.43; redderL = 0.95; brighterL = 1.00; brightenDarkL = 1.25; # ------------------------------------------------------------ # TNTmips VERSION / PATCH INPUT: p1$ = "VERSION / PATCH ENTRY:\n"; p2$ = " Yes: Running TNTmips V7.1 With PATCH\n"; p3$ = " Dated July 13, 2005, or LATER\n"; p4$ = " No: Running Earlier VERSION or PATCH."; p$ = p1$ + p2$ + p3$ + p4$; fCLR = PopupYesNo(p$,1); if (fCLR == 1) then begin fR = 1; fB = 2^16; end # ------------------------------------------------------------ # ACCEPT ENHANCEMENT DEFAULTS: p$ = "Do You Want to Apply Default ENHANCEMENTS?"; d = PopupYesNo(p$,0); # ------------------------------------------------------------ # WATER-MASK OPTION: p1$ = "WATER-MASK OPTION ENTRY:\n"; p2$ = " OPTIONS:\n"; p3$ = " 1: Create a NEW WATERMASK Raster.\n"; p4$ = " 2: Use an EXISTING WATERMASK Raster.\n"; p5$ = " Existing Raster Must Match SRFI Rasters.\n"; p6$ = "OPTION ENTERED:"; p$ = p1$ + p2$ + p3$ + p4$ + p5$ + p6$; m = PopupNum(p$,2,1,2,0); # ------------------------------------------------------------ # LAND-IMAGE OPTION: p1$ = "LAND-IMAGE OPTION ENTRY:\n"; p2$ = " OPTIONS:\n"; p3$ = " 1: COLOR INFRARED IMAGE (CIR).\n"; p4$ = " 2. NATURAL COLOR IMAGE.\n"; p5$ = " 3: GRAYSCALE (GREEN BAND ONLY) IMAGE.\n"; p6$ = " 4: GRAYSCALE (NIR BAND ONLY) IMAGE.\n"; p7$ = "OPTION ENTERED:"; p$ = p1$ + p2$ + p3$ + p4$ + p5$ +p6$ +p7$; tLP = PopupNum(p$,4,1,4,0); # ------------------------------------------------------------ # MAKE WATER-COLORS REDDER: p1$ = "REDDER-WATER-COLORS PARAMETER ENTRY:\n"; p2$ = "VALUE OF redderW ENTERED:"; p$ = p1$ + p2$; if (d == 0) then begin redderW = PopupNum(p$,redderW,0.1,2,2); end # ------------------------------------------------------------ # MAKE ALL-WATER-COLORS BRIGHTER: p1$ = "BRIGHTER-WATER-COLORS PARAMETER ENTRY:\n"; p2$ = "VALUE FOR brighterW ENTERED:"; p$ = p1$ + p2$; if (d == 0) then begin brighterW = PopupNum(p$,brighterW,0.1,2,2); end # ------------------------------------------------------------ # MAKE DARK-WATER-COLORS BRIGHTER: p1$ = "BRIGHTEN-DARK-WATER-COLORS PARAMETER ENTRY:\n"; p2$ = "VALUE OF brightenDarkW ENTERED:"; p$ = p1$ + p2$; if (d == 0) then begin brightenDarkW = PopupNum(p$,brightenDarkW,0.1,2,2); end # ------------------------------------------------------------ # MAKE LAND-COLORS REDDER: p1$ = "REDDER-LAND-COLORS PARAMETER ENTRY:\n"; p2$ = "VALUE OF redderL ENTERED:"; p$ = p1$ + p2$; if (d == 0) then begin if (tLP < 3) then begin redderL = PopupNum(p$,redderL,0.1,2,2); end end # ------------------------------------------------------------ # MAKE ALL-LAND-COLORS BRIGHTER: p1$ = "BRIGHTER-LAND-COLORS PARAMETER ENTRY:\n"; p2$ = "VALUE OF brighterL ENTERED:"; p$ = p1$ + p2$; if (d == 0) then begin brighterL = PopupNum(p$,brighterL,0.1,2,2); end # ------------------------------------------------------------ # MAKE DARK-LAND-COLORS BRIGHTER: p1$ = "BRIGHTEN-DARK-LAND-COLORS PARAMETER ENTRY:\n"; p2$ = "VALUE OF brightenDarkL ENTERED:"; p$ = p1$ + p2$; if (d == 0) then begin brightenDarkL = PopupNum(p$,brightenDarkL,0.1,2,2); end # ------------------------------------------------------------ # LAND-WATER BOUNDARY CONTROL PARAMETERS: if (m == 1) then begin p1$ = "LINE-EQUATION MULTIPLIER ENTRY:\n"; p2$ = " RANGE: 0.00 to 10.00\n"; p3$ = "VALUE OF facBL ENTERED:"; p$ = p1$ + p2$ + p3$; facBL = PopupNum(p$,0.16,0.0,10,2); p1$ = "LINE-EQUATION SRFINA OFFSET ENTRY:\n"; p2$ = " RANGE: 1 to 2000\n"; p3$ = "VALUE OF offNA ENTERED:"; p$ = p1$ + p2$ + p3$; offNA = PopupNum(p$,925,1,3000,0); end # ------------------------------------------------------------ # WRITE TITLE & AUTHOR INFORMATION: clear(); writeTitle(); # ------------------------------------------------------------ # PRINT USER INPUTS TO CONSOLE WINDOW: if (m == 1) then begin printf("A NEW WATER-MASK IS BEING CREATED.\n\n"); end if (m == 2) then begin printf("AN EXISTING WATER-MASK IS BEING USED.\n"); printf("NOTE: Existing WATER-MASK Must Match"); printf(" SRFI rasters.\n\n"); end if (tLP == 1) then begin printf("LAND PIXELS WILL HAVE CIR COLORS."); end if (tLP == 2) then begin printf("LAND PIXELS WILL HAVE NATURAL COLORS."); end if (tLP == 3) then begin printf("LAND PIXELS WILL HAVE GREEN-BAND GRAY TONES."); end if (tLP == 4) then begin printf("LAND PIXELS WILL HAVE NIR-BAND GRAY TONES."); end printf("\n\n"); printf("IMAGE ENHANCEMENT PARAMETERS FOR WATER PIXELS:\n"); printf(" redderW = %4.2f\n",redderW); printf(" brighterW = %4.2f\n",brighterW); printf(" brightenDarkW = %4.2f\n\n",brightenDarkW); printf("IMAGE ENHANCEMENT PARAMETERS FOR LAND PIXELS:\n"); if (tLP < 3) then begin printf(" redderL = %4.2f\n",redderL); end printf(" brighterL = %4.2f\n",brighterL); printf(" brightenDarkL = %4.2f\n",brightenDarkL); printf("\n"); if (m == 1) then begin printf("WATERMASK CONTROL PARAMETERS:\n"); printf(" facBL = %4.2f\n",facBL); printf(" offNA = %4d\n\n",offNA); end # ------------------------------------------------------------ # OPEN SRFIsfc RASTERS: printf("OPEN SRFIsfc RASTERS (ANY APPROPRIATE SOURCE):\n"); printf(" WARNING! MUST be SURFACE-RELATED.\n"); printf(" SRFIBL"); GetInputRaster(SRFIBL); nlins = NumLins(SRFIBL); ncols = NumCols(SRFIBL); stype$ = RastType(SRFIBL); checkHisto(SRFIBL); printf(" SRFIGL"); GetInputRaster(SRFIGL,nlins,ncols,stype$); checkHisto(SRFIGL); printf(" SRFIRL"); GetInputRaster(SRFIRL,nlins,ncols,stype$); checkHisto(SRFIRL); printf(" SRFINA"); GetInputRaster(SRFINA,nlins,ncols,stype$); checkHisto(SRFINA); printf("\n\n"); # ------------------------------------------------------------ # IF m == 2, OPEN WATER-MASK RASTER: if (m == 2) then begin printf("OPEN WATERMASK RASTER."); GetInputRaster(WATERMASK,nlins,ncols,"binary"); checkHisto(WATERMASK); IgnoreNull(WATERMASK); printf("\n\n"); end # ------------------------------------------------------------ # IF m == 1, CREATE NEW OUTPUT RASTER(S: printf("CREATE NEW OUTPUT RASTER(S):\n"); if (m == 1) then begin printf(" WATERMASK"); GetOutputRaster(WATERMASK,nlins,ncols,"binary"); IgnoreNull(WATERMASK); CopySubobjects(SRFIBL,WATERMASK,"GEOREF"); printf(" IMAGE"); GetOutputRaster(IMAGE,nlins,ncols,"24-bit color RGB"); IgnoreNull(IMAGE); CopySubobjects(SRFIBL,IMAGE,"GEOREF"); end # ------------------------------------------------------------ # IF m == 2, CREATE NEW IMAGE RASTER ONLY: if (m == 2) then begin printf(" IMAGE"); GetOutputRaster(IMAGE,nlins,ncols,"24-bit color RGB"); IgnoreNull(IMAGE); CopySubobjects(SRFIBL,IMAGE,"GEOREF"); end printf("\n\n"); # ------------------------------------------------------------ # PRODUCE VALUES FOR OUTPUT WATERMASK PIXELS: if (m == 1) then begin printf("FILLING WATERMASK RASTER WITH VALUES."); for each SRFINA begin x = SRFIBL; nc = IsNull(x); if (nc == 0) then begin wm = 1; yt = round(facBL * x + offNA); y = SRFINA; if (y > yt) then wm = 0; end WATERMASK = wm; end printf("\n\n"); end # ------------------------------------------------------------ # PRODUCE VALUES FOR OUTPUT IMAGE RASTER WATER-PIXELS: srfiGLmaxW = 1500 / brighterW; srfiRLmaxW = srfiGLmaxW / (redderW^1.51); srfiBLmaxW = srfiGLmaxW * redderW; pW = 1 / brightenDarkW; printf("DERIVED ENHANCEMENT FACTORS FOR WATER PIXELS:\n"); printf(" srfiBLmaxW = %4d\n",srfiBLmaxW); printf(" srfiGLmaxW = %4d\n",srfiGLmaxW); printf(" srfiRLmaxW = %4d\n",srfiRLmaxW); printf(" pW = %4.2f\n\n",pW); for i=1 to 65535 begin v = 1 + round(254*(((i - 1) / srfiBLmaxW)^pW)); if (v < 1) then v = 1; if (v > 255) then v = 255; sBL_8[i] = v; end for i=1 to 65535 begin v = 1 + round(254*(((i - 1) / srfiGLmaxW)^pW)); if (v < 1) then v = 1; if (v > 255) then v = 255; sGL_8[i] = v; end for i=1 to 65535 begin v = 1 + round(254*(((i - 1) / srfiRLmaxW)^pW)); if (v < 1) then v = 1; if (v > 255) then v = 255; sRL_8[i] = v; end if (tLP == 1) then begin srfiRLmaxL = 5500 / brighterL; srfiNAmaxL = srfiRLmaxL / redderL; srfiGLmaxL = srfiRLmaxL * (redderL^1.01); srfiBLmaxL = srfiRLmaxL * (redderL^1.68); end if (tLP == 2) then begin srfiGLmaxL = 3951 / brighterL; srfiBLmaxL = srfiGLmaxL * redderL; srfiRLmaxL = srfiGLmaxL / (redderL^1.65); srfiNAmaxL = srfiGLmaxL / (redderL^1.97); end if (tLP == 3) then begin srfiGLmaxL = 3951 / brighterL; srfiBLmaxL = srfiGLmaxL * redderL; srfiRLmaxL = srfiGLmaxL / (redderL^1.65); srfiNAmaxL = srfiGLmaxL / (redderL^1.97); end if (tLP == 4) then begin srfiNAmaxL = 5800 / brighterL; srfiRLmaxL = srfiNAmaxL * redderL; srfiGLmaxL = srfiNAmaxL * (redderL^1.99); srfiBLmaxL = srfiNAmaxL * (redderL^2.64); end pL = 1 / brightenDarkL; printf("DERIVED ENHANCEMENT FACTORS FOR LAND PIXELS:\n"); if (tLP == 2) then begin printf(" srfiBLmaxL = %4d\n",srfiBLmaxL); end if (tLP < 4) then begin printf(" srfiGLmaxL = %4d\n",srfiGLmaxL); end if (tLP < 3) then begin printf(" srfiRLmaxL = %4d\n",srfiRLmaxL); end if (tLP == 1 or tLP == 4) then begin printf(" srfiNAmaxL = %4d\n",srfiNAmaxL); end printf(" pL = %4.2f\n\n",pL); printf("COLORIZING THE WATER PIXELS."); for each WATERMASK begin wm = WATERMASK; if (wm == 1) then begin v = SRFIBL; iB = sBL_8[v]; v = SRFIGL; iG = sGL_8[v]; v = SRFIRL; iR= sRL_8[v]; IMAGE = iR * fR + iG * fG + iB * fB; end end printf("\n\n"); # ------------------------------------------------------------ # PRODUCE VALUES FOR OUTPUT IMAGE RASTERS LAND-PIXELS: for i=1 to 65535 begin v = 1 + round(254*(((i - 1) / srfiBLmaxL)^pL)); if (v < 1) then v = 1; if (v > 255) then v = 255; sBL_8[i] = v; end for i=1 to 65535 begin v = 20 + round(235*(((i - 1) / srfiGLmaxL)^pL)); if (v < 1) then v = 1; if (v > 255) then v = 255; sGL_8[i] = v; end for i=1 to 65535 begin v = 1 + round(254*(((i - 1) / srfiRLmaxL)^pL)); if (v < 1) then v = 1; if (v > 255) then v = 255; sRL_8[i] = v; end for i=1 to 65535 begin v = 1 + round(254*(((i - 1) / srfiNAmaxL)^pL)); if (v < 1) then v = 1; if (v > 255) then v = 255; sNA_8[i] = v; end printf("COLORIZING THE LAND PIXELS."); for each WATERMASK begin wm = WATERMASK; if (wm == 0) then begin v = SRFIGL; nc = IsNull(v); if (nc == 0) then begin if (tLP <> 2) then begin iB = sGL_8[v]; v = SRFIRL; iG = sRL_8[v]; v = SRFINA; iR = sNA_8[v]; end if (tLP == 2) then begin v = SRFIBL; iB = sBL_8[v]; v = SRFIGL; iG = sGL_8[v]; v = SRFIRL; iR = sRL_8[v]; end if (tLP == 3) then begin iG = iB; iR = iB; end if (tLP == 4) then begin iB = iR; iG = iR; end IMAGE = iR * fR + iG * fG + iB * fB; end end end printf("\n\n"); printf("CREATING HISTOGRAMS & PYRAMIDS FOR IMAGE RASTERS."); # ------------------------------------------------------------ # CREATE HISTOGRAMS & PYRAMIDS FOR OUTPUT RASTERS: SetNull(IMAGE,0); CreateHistogram(IMAGE,0); CreatePyramid(IMAGE,0); if (m == 1) then begin CreateHistogram(WATERMASK,0); CreatePyramid(WATERMASK,0); end # ------------------------------------------------------------ # CLOSE or DELETE RASTERS: CloseRaster(SRFIBL); CloseRaster(SRFIGL); CloseRaster(SRFIRL); CloseRaster(SRFINA); CloseRaster(WATERMASK); CloseRaster(IMAGE); printf("\n\n"); printf("TO SAVE THE CONSOLE WINDOW TEXT AS A REPORT:\n"); printf(" 1. RIGHT-CLICK IN THE CONSOLE WINDOW.\n"); printf(" 2. SELECT THE Save As... OPTION.\n"); printf(" 3. NAVIGATE TO THE DESIRED LOCATION.\n"); printf(" 4. PROVIDE A REPORT NAME (or OVERWRITE).\n"); printf(" 5. CLICK OK.");