FREC 682 -- Spatial Analysis
Image Processing


This project introduces various image processing techniques: digital filtering and contrast enhancement, creation of false-color composites, image registration to real-world coordinates, analysis of spectral signatures and supervised and unsupervised classification into land-use/land cover (LULC) categories. You are urged to read Chapter 7 of Lillesand and Kiefer's Remote Sensing and Image Interpretation, for an introduction to these techniques. The GRASS Image Processing tutorial by Harmon and Shapiro provides a useful (if slightly outdated) guide to GRASS's image processing modules. The image classification exercise is merely supposed to familiarize you with unsupervised classification methods; you are not expected to produce a highly accurate LULC map.

Data

The GRASS location imagery uses an arbitrary X-Y coordinate system to store raw satellite imagery. The PERMANENT mapset in the imagery location contains a set of six Landsat Thematic Mapper (TM) band files, sncc.tm1, sncc.tm2, sncc.tm3, sncc.tm4, sncc.tm5 and sncc.tm7 for use in this project. These files record light reflectance from the Earth in visible blue, green, red and three infrared wavelengths at 30-meter ground resolution. (The TM band 6 file, which records thermal infrared reflectance at 120-meter resolution, is omitted.) This imagery was recorded April 28, 1989. These files cover Southern New Castle County, Delwaware, from the Chesapeake & Delaware Canal down to the Smyrna River. The permanent mapset also contains a 10-meter resolution SPOT panchromatic image of the same area.

You will be using vector TIGER files of New Castle County road, rail and water features in the de_utm83 location to identify registration points in the imagery files and then register the imagery into the de_utm83 location. These vector files all begin with the prefix de_ncc.

The PERMANENT mapset in the de_utm83 location also contains the map newc_lu92, a land-use/land cover map of New Castle County generated from 1992 digital orthophotos and generalized to 13 LULC categories. You can refer to this map when classifying the 1989 imagery.

Procedures

  1. d.rast each of the sncc.tm* band files. Each is has a histogram-equalized color table. To see what the original band file looks like, try resetting the color table to grey: r.colors sncc.tm1 c=grey. Then you can reset the color table to r.colors sncc.tm1 c=grey.eq

    Note that the first three band files have varying degrees of haze. You can obtain some further clarification by filtering out some of this haze by truncating or "saturating" the extreme reflectance values. First, d.erase blue to clear your display monitor to a blue background; then use d.histogram to display the histogram of reflectance values. Visually determine approximate 2% cutoff values on the tails of these three band files' histograms. Then use r.mapcalc to convert reflectance values lying outside this range to the cutoff values. Assign a greyscale color table to each saturated band file, and compare each to the original band files in side-by-side monitor frames. Save a black-and-white image of the Band 1 comparison.

  2. Use d.rgb to create a color-IR composite from bands 2, 3 and 4, and, optionally, a regular false color composite from bands 1, 2 and 3.

  3. Use the series of modules i.group, i.target, i.vpoints and i.rectify to register the set of raw TM band files from the imagery location to your mapset in the de_utm83 location. First, i.group the 6 original band files with your color-IR composite(s) into an imagery group so they will all be registered together. (Don't include the SPOT image; it's got different imagery location coordinates.) Next, define the target location and mapset for the registered versions with i.target.

    Enlarge your display monitor to nearly full-screen and run i.vpoints. (Note: the i.points module is an alternative to i.vpoints: this lets you define registration points using raster files in the target location.) Display a color composite from the imagery location in the upper left frame, and vector road, rail and water features from the target location in the upper right frame. Use the lower frames to zoom way in on coresponding subareas in the upper frames. (Note: your vector display defaults to the region you last used in the de_utm83 location; if you can't display southern New Castle County, quit the imagery location, start a GRASS session in the de_utm83 location, and reset that region so it covers southern New Castle County. Then quit and restart the GRASS session in the imagery location)

    Click the left mouse button to specify match corresponding points in the imagery and target locations. Match at least 6 points as accurately as possible at road intersections or other landmarks. (Keep in mind that roads and rail lines are more stable than streams or shorelines.) Take your time here, and zoom way in to place your points: you need to be as accurate as possible.

    Once you have located 6-10 points, analyze them. Delete any points with errors greater than one (cell). You can add additional points as needed. When you have at least five or six accurately referenced points with minimal errors, quit i.vpoints. If you notice continuing screen flicker, the monitor is still in a "float" color mode; run d.colormode fixed to reset the monitor to "fixed" color mode, and d.frame -e to clear residual frames.

    Use i.rectify to register the imagery files into your mapset in the de_utm83 location. i.rectify usually takes a while and runs as a background process; it will send you e-mail notifying you when it's done.

    To check your results, exit GRASS, re-start in the de_utm83 location, d.rast one of the registered maps and d.vect the TIGER water features over it: the shorelines should line up very closely, even when zoomed in. If the registered images don't line up well with the vector data, g.remove them, switch back to the imagery location, correct your registration points in i.vpoints and re-run i.rectify. (Note that the examples above are displayed through a MASK created from the newc_lu92 map. Without the mask, you will see the full rectangular image tilted clockwise about 9 degrees.)

    Save images of your registered color and color-IR composites with the vector features overlaid.

  4. In the de_utm83 location, use i.group to group the registered imagery files with any color composite or other maps you want to use for visual referencing. Create a sub-group with just the band files to be used in creating spectral signatures (DON'T include color composites). Run i.cluster to define 50 clusters of spectral signatures (statistically distinct spectral classes). Then run i.maxlik to assign each cell to a spectral class using the signature file created by i.cluster. Then compare your mapping of 1989 spectral classes against the 1992 LULC classes in the raster map newc_lu92 using r.coin, r.report or whatever. Finally, use r.reclass to match each specral class in the 1989 imagery to the likeliest LULC class.

    Create appropriate colors for your new 1989 LULC map. Use d.colors or r.colors, or else copy and adapt the color file for newc_lu92 from the PERMANENT mapset's colr directory. Save an image of your unsupervised classification map with main roads, rail lines and water vector features overlaid.

  5. Finally, try a supervised classification for comparison. Use i.class and the mouse to delineate several representative clusters of pixels in either of your 1989 color composite images for each of the categories in the newc_lu92 map. Check the signature histograms for each class, and try to obtain narrow histograms so that your classes have as little overlap in spectral signatures as possible. (Forest, ag, wetland and water signatures are typically easier to define than developed category signatures.) Then use i.maxlik to assign each pixel in the region to one of your defined classes. (Don't get obsessive about this. You'll find that unsupervised classification results often look a lot better than supervised classifications.)

    Use the same color scheme for your new supervised classification, and save an image of it with road, rail and water featuers overlaid.

    If your're really ambitious, you can try out i.smap instead of i.maxlik. This module uses "sequential maximum a posteriori" classification methods, and can iteratively segment pixels into broad and fine classes exploiting probable class similarities to neighboring pixels.

Write up a web page summarizing your procedures, displaying your maps and discussing your results. Which classification method worked better? What categories were hardest to classify?

Remember that the objective of this exercise is to familiarize you with image processing and classification techniques. Don't worry if you don't get great-looking classification maps: really accurate image classification takes a lot more time and effort than I want you to spend on this project!