# ------------------------------------------------------------ # FILTER_WATERMASK.sml # ------------------------------------------------------------ # SET WARNING LEVEL: $warnings 3 # ------------------------------------------------------------ # DEFINE PROCEDURE writeTitle: # PURPOSE: WRITES TITLE & AUTHOR INFO TO CONSOLE WINDOW. proc writeTitle() begin printf("FILTER_WATERMASK.sml:\n"); printf(" VERSION: November 15, 2005\n"); printf(" PURPOSE: Process WATERMASK Raster\n"); printf(" to Convert ISOLATED WATER\n"); printf(" PIXELS to LAND PIXELS.\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 # ------------------------------------------------------------ clear(); writeTitle(); # ------------------------------------------------------------ # DECLARE VARIABLES: raster WATERMASK; numeric nlins,ncols,lin,col,nlinsm1,ncolsm1; numeric v1,v2,v3,v4,v5,v6,v7,v8,v9,vtest,change; numeric pass,count,lm1,lp1,cm1,cp1; # ------------------------------------------------------------ # 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$); # ------------------------------------------------------------ # ISSUE WARNING: p1$ = " !!! WARNING !!!\n\n"; p2$ = "ONLY USE a COPY of the WATERMASK Raster as INPUT.\n"; p3$ = "The Input WATERMASK Raster is "; p4$ = "ALTERED by this SML.\n\n"; p5$ = "Click the Next CANCEL Button "; p6$ = "to STOP this Process."; p$ = p1$ + p2$ + p3$ + p4$ + p5$ + p6$; 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 # ------------------------------------------------------------ # GET INPUT RASTER: GetInputRaster(WATERMASK); IgnoreNull(WATERMASK); checkHisto(WATERMASK); DeleteHistogram(WATERMASK); DeletePyramid(WATERMASK); nlins = NumLins(WATERMASK); ncols = NumCols(WATERMASK); nlinsm1 = nlins - 1; ncolsm1 = ncols - 1; # ------------------------------------------------------------ # SCAN INTERIOR REGION TO DETECT WATER PIXELS FOR CONVERSION: printf("SEARCH FOR WATER-PIXELS TO CONVERT TO"); printf(" LAND-PIXELS:\n\n"); printf("SCANNING INTERIOR PIXELS:\n"); pass = 0; count = 1; while (count > 0) begin pass = pass + 1; count = 0; printf("Pass %3d ... ",pass); for lin=2 to nlinsm1 begin lm1 = lin - 1; lp1 = lin + 1; for col=2 to ncolsm1 begin v5 = WATERMASK[lin,col]; if (v5 == 1) then begin # 28: cm1 = col - 1; cp1 = col + 1; change = 0; v2 = WATERMASK[lm1,col]; v7 = WATERMASK[lp1,col]; vtest = SetMax(v2,v7); if (vtest == 0) then begin change = 1; end if (change == 0) then begin # 46: v4 = WATERMASK[lin,cm1]; v6 = WATERMASK[lin,cp1]; vtest = SetMax(v4,v6); if (vtest == 0) then begin change = 1; end end if (change == 0) then begin # 19: v1 = WATERMASK[lm1,cm1]; v9 = WATERMASK[lp1,cp1]; vtest = SetMax(v1,v9); if (vtest == 0) then begin change = 1; end end if (change == 0) then begin # 37: v3 = WATERMASK[lm1,cp1]; v7 = WATERMASK[lp1,cm1]; vtest = SetMax(v3,v7); if (vtest == 0) then begin change = 1; end end if (change == 1) then begin WATERMASK[lin,col] = 0; count = count + 1; end end end end printf("converted %5d pixels.\n",count); end printf("\n"); # ------------------------------------------------------------ # SCAN EDGE PIXELS TO FIND WATER PIXELS FOR CONVERSION: printf("SCANNING EDGE PIXELS:\n"); pass = pass + 1; printf("Pass %3d ... ",pass); count = 1; # Top: for col = 1 to ncols begin v5 = WATERMASK[1,col]; v8 = WATERMASK[2,col]; if (v5 == 1) then begin if (v8 == 0) then begin WATERMASK[1,col] = 0; count = count + 1; end end end # Bottom: for col = 1 to ncols begin v5 = WATERMASK[nlins,col]; v2 = WATERMASK[nlinsm1,col]; if (v5 == 1) then begin if (v2 == 0) then begin WATERMASK[nlins,col] = 0; count = count + 1; end end end # Left: for lin = 1 to nlins begin v5 = WATERMASK[lin,1]; v6 = WATERMASK[lin,2]; if (v5 == 1) then begin if (v6 == 0) then begin WATERMASK[lin,1] = 0; count = count + 1; end end end # Right: for lin = 1 to nlins begin v5 = WATERMASK[lin,ncols]; v4 = WATERMASK[lin,ncolsm1]; if (v5 == 1) then begin if (v4 == 0) then begin WATERMASK[lin,ncols] = 0; count = count + 1; end end end printf("converted %5d pixels.\n",count); # ------------------------------------------------------------ # FINISH HOUSEKEEPING CHORES & CLOSE RASTER: DeleteHistogram(WATERMASK); CreateHistogram(WATERMASK,0); DeletePyramid(WATERMASK); CreatePyramid(WATERMASK,0); CloseRaster(WATERMASK); 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.");