I downloaded some Landsat 8 OLI/TIRS C1 Level-1 images from EarthExplorer. I was hoping to get reflectance data out of the blue, green and red band; however, when I opened those images in ArcMap, the scale does not seem to be reflectance, given that is not in the range between 0 - 1 (theoretical values of reflectance).
The values that I am getting are 0 - 40079 (blue band) and 0 - 40336 (red band). My question is, is there some type of corrections that I need to do? maybe some transformation?
Answer
This information is a bit buried but, if you read the USGS Landsat Surface Reflectance-derived Spectral Indices product guide and the associate processing software guide, you can ascertain that reflectance values are scaled to 16-bit, which is consistent with your observed data range. This processing and rescaling occurs in the LEDAPS (TM4,TM5,ETM+7) or L8SR (OLI) software so, you can track down the USGS documentation for technical details. If you want a 0-1 data range just rescale the data accordingly. One confusing factor is that floating point reflectance values do not always bound 0-1 and when rescaled to 16-bit, in the processing workflow, can end up having large negative numbers. I just bound the lower data range to 0 before rescaling as it is functionally the same as doing this on floating point data.
As @Mouad Alami pointed out, if you did not request reflectance as part of the data archive and are working with the DN values, it is necessary to apply a simple workflow to convert the data to reflectance. It should be noted that the equations are sensor specific.
If you want to operate on the DN values directly, here is an R example of DN to reflectance for OLI data that gives the general code syntax.
oli.reflectance <- function(x, sun.elev = NULL, multiplicative.rescaling = 0.00002,
additive.rescaling = -0.100000) {
if(!class(x) %in% c("RasterLayer", "RasterStack"))
stop( "x must be raster class object" )
if(is.null(sun.elev))
stop("Must provide sun elevation angle value from SUN_ELEVATION in metadata")
refl <- function(x, m, a, se) {
y <- (x * m + a) / sin(as.numeric(se) * pi /180)
return(y)
}
return( refl( x, multiplicative.rescaling, additive.rescaling, sun.elev) )
}
Model parameters (arguments)
m (additive.rescaling) - Additive rescaling factor (REFLECTANCE_MULT_BAND_x)
a (multiplicative.rescaling) - Quantized calibrated standard product pixel values (REFLECTANCE_ADD_BAND_x)
se (sun.elev) - sun elevation angle (SUN_ELEVATION)
The terms "at-sensor" (4,5,7) and "surface" (8) reflectance are synonymous but are used in the context of the specific sensor as the atmospheric correction algorithms are quite different. The tier 2 products are have terrain and radiometric calibration (cross-sensor and temporal) applied making the bands and indices comparable across scenes. However, this type of temporal comparison should always be carried out on the reflectance data.
No comments:
Post a Comment