Reef mapping using satellite imagery

From Brenchie's Lab
Jump to navigation Jump to search

Working protocol

The current protocol uses image preprocessing steps taken from Kyle Hogrefe's bathymetry Cookbook and the QGIS Semi-Automatic Classification Plugin tutorial.

Step by step

  1. Figure out which image you want
    1. We decided to use Landsat 8 imagery since it is free and global and recent
    2. Using the [LandsatLook viewer you can find an image that doesn't have any clouds over your area of interest (shallow coastal waters)
    3. Check off Landsat 8 in the search box and click search, then check "Active Date Only" and find a date without clouds
    4. Write down the date of the image
  2. Download imagery
    1. This is fairly straightforward with the SCP, start by clicking the Download Products button and select "L8 OLI/TRS" from the Products drop down menu
    2. To get your UL (upper left) and LR (lower right) latitudes and longitudes, you can right click in Google Maps and click "What's here?" then click on the longitude and latitude that it links in the pop-up box
    3. For Aruba we used UL: X (Lon) = -70.150329; Y (Lat) = 12.669058 and LR: X (Lon) = -69.834315; Y (Lat) = 12.380330
    4. Pick dates to contain the cloud free date you identified in the first step and click the search button
    5. For Aruba we used 26-12-2016
    6. Once the results pop up, click on the one you want to make sure it looks cloud free in the preview, it should be the same image as the one you found in the LandsatLook viewer earlier
    7. Click on the button to the right of the preview that has a little map and an arrow pointing down on it, with the pop-up text "Display preview of highlighted images in map"
    8. In the Download options tab, check off bands 2 - 5 and Ancillary Data under the Landsat bands header
    9. Click RUN to download the image, select the folder where you want to save it -- once you click OK there should be a status bar at the top letting you know it's downloading
    10. Each band will be downloaded and loaded into your map as a separate layer, B2 is blue, B3 is green, B4 is red, and B5 is near infrared (NIR)
    11. Google Earth Engine has a good overview of the properties of the Landsat 8 dataset
  3. Clip the image
    1. For Aruba, one Landsat tile is much more image than we need, so we can clip it to make processing go faster


  • The deglinting process works best when applied to a relatively homogeneous area, both in terms of location and imagery. In our experience, the surface of the ocean to the north of Aruba had a significantly different wave glint pattern, which was not removed when the deglinting analysis was based on the ocean to the south, and vice versa. We also attempted to do the algorithm on a mosaic of multiple image tiles, which also showed differences between the two image areas depending on where the background glint area was selected (step 3.2 of the cookbook). We decided to focus on one satellite image at a time, and one side of the island, choosing the south side due to shallower bathymetry and higher known abundance of shallow reefs.

Bathymetry Cookbook

  1. Image viewing - depends on your imagery, make sure different layers are aligned
  2. Data conversion DN to radiance - Radiance = DN/Cal Coeff using raster calculation
  3. Deglinting, atmosphere and water reflection correction - pick ROI with only glint, linearly regress NIR vs each band and adjust
  4. Linearize spectral decay
  5. Mask n/a values
  6. Georectify
  7. Extract spectral and depth data
  8. Linear regression
  9. Integrate with sonar data
Imagery used
IKONOS 4-band 4m geometric corrected

Allen Coral Atlas


Planet’s PlanetScope satellite imagery
  1. Top of Atmosphere Radiance (TOAR)
  2. Flatfield correction
  3. Debayering
  4. Sensor and radiometric calibration
  5. Orthorectification
  6. Surface reflectance
Image mask
For Aruba, coastal waters without land
Done in PlanetScope imagery


Atmospheric correction
Waterbody retrieval
Sun glint removal
Depth calculation
Bottom reflectance estimation


Four levels of classification
  1. Reef versus non-reef (0-15 m depth);
  2. Reef Type (0-15 m depth);
  3. Reef geomorphic zonation (0-15 m depth); and
  4. Reef benthic composition (0-5 m)


After downloading and stitching image>

Python notes

Step 1: Removal of atmospheric effects -- Code:

# Import the Py6S module
from Py6S import *
# Create a SixS object
s = SixS()
# Set the wavelength to 0.675um
s.wavelength = Wavelength(0.675)
# Set the aerosol profile to Maritime
s.aero_profile = AeroProfile.PredefinedType(AeroProfile.Maritime)
# Run the model
# Print some outputs
print s.outputs.pixel_reflectance, s.outputs.pixel_radiance, s.outputs.direct_solar_irradiance
# Run the model across the VNIR wavelengths, and plot the result
wavelengths, results = SixSHelpers.Wavelengths.run_vnir(s, output_name='pixel_radiance')
SixSHelpers.Wavelengths.plot_wavelengths(wavelengths, results, "Pixel radiance ($W/m^2$)")

Step 2: Deglinting & water column correction -- Code

Step 3: Apply classifiers and/or create classification between contrast