Compute path radiance based on the dark object method

Description

Compute an estimated path radiance for all sensor bands, which can then be used to roughly correct the radiance values for atmospheric scattering. Path radiance estimation is based on a dark object method.

Usage

1
2
3
4
5
6
7
8
## S4 method for signature 'Satellite'
calcPathRadDOS(x, model = c("DOS2", "DOS4"),
  esun_method = "RadRef", use_cpp = TRUE)

## S4 method for signature 'numeric'
calcPathRadDOS(x, bnbr, band_wls, radm, rada, szen, esun,
  model = c("DOS2", "DOS4"), scat_coef = c(-4, -2, -1, -0.7, -0.5),
  dos_adjust = 0.01, use_cpp = TRUE)

Arguments

x

A Satellite object or the value (scaled count) of a dark object in bnbr (e.g. minimum raw count of selected raster bnbr). If x is a Satellite object, the value is computed using calcDODN.

model

Model to be used to correct for 1% scattering (DOS2, DOS4; must be the same as used by calcAtmosCorr).

esun_method

If x is a Satellite object, name of the method to be used to compute esun using one of calcTOAIrradRadRef ("RadRef"), calcTOAIrradTable ("Table") or calcTOAIrradModel ("Model")

use_cpp

Logical. If TRUE, C++ functionality (via Rcpp) is enabled, which leads to a considerable reduction of both computation time and memory usage.

bnbr

Band number for which DNmin is valid.

band_wls

Band wavelengths to be corrected; data.frame with min (max) in first (second) column, see details.

radm

Multiplicative coefficient for radiance transformation (i.e. slope).

rada

Additive coefficient for radiance transformation (i.e. offset).

szen

Sun zenith angle.

esun

Actual (i.e. non-normalized) TOA solar irradiance, e.g. returned by calcTOAIrradRadRef, calcTOAIrradTable or calcTOAIrradModel.

scat_coef

Scattering coefficient; defaults to -4.0.

dos_adjust

Assumed reflection for dark object adjustment; defaults to 0.01.

Details

If x is a Satellite object, the minimum raw count value (x) is computed using calcDODN. If the TOA solar irradiance is not part of the Satellite object's metadata, it is computed using calcTOAIrradRadRef, calcTOAIrradTable or calcTOAIrradModel.

The dark object subtraction approach is based on an approximation of the atmospheric path radiance (i.e. upwelling radiation which is scattered into the sensors field of view, aka haze) using the reflectance of a dark object (i.e. reflectance ~1%).

Chavez (1988) proposed a method which uses the dark object reflectance in one band to predict the corresponding path radiances in all other band_wls. This is done using a relative radiance model which depends on the wavelength and overall atmospheric optical thickness (which is estimated based on the dark object's DN value). This has the advantage that the path radiance is actually correlated across different sensor band_wls and not computed individually for each band using independent dark objects. He proposed a relative radiance model which follows a wavelength dependent scattering that ranges from a power of -4 over -2, -1, -0.7 to -0.5 for very clear over clear, moderate, hazy to very hazy conditions. The relative factors are computed individually for each 1/1000 wavelength within each band range and subsequently averaged over the band as proposed by Goslee (2011).

The atmospheric transmittance towards the sensor (Tv) is approximated by 1.0 (DOS2, Chavez 1996) or Rayleigh scattering (DOS4, Moran et al. 1992)

The atmospheric transmittance from the sun (Tz) is approximated by the cosine of the sun zenith angle (DOS2, Chavez 1996) or again using Rayleigh scattering (DOS4, Moran et al. 1992).

The downwelling diffuse irradiance is approximated by 0.0 (DOS2, Chavez 1996) or the hemispherical integral of the path radiance (DOS4, Moran et al. 1992).

Equations for the path radiance are taken from Song et al. (2001).

For some sensors, the band wavelengths are already included. See lutInfo()[grepl("_BANDS", names(lutInfo()$META))] if your sensor is included. To retrieve a sensor, use lutInfo()$<Sensor ID>_BANDS.

Value

Satellite object with path radiance for each band in the metadata (W m-2 micrometer-1)

Vector object with path radiance values for each band (W m-2 micrometer-1)

References

Chavez Jr PS (1988) An improved dark-object subtraction technique for atmospheric scattering correction of multispectral data. Remote Sensing of Environment 24/3, doi:10.1016/0034-4257(88)90019-3, available online at http://www.sciencedirect.com/science/article/pii/0034425788900193.

Chavez Jr PS (1996) Image-based atmospheric corrections revisited and improved. Photogrammetric Engineering and Remote Sensing 62/9, available online at http://www.asprs.org/PE-RS-Journals-1996/PE-RS-September-1996.html.

Goslee SC (2011) Analyzing Remote Sensing Data in R: The landsat Package. Journal of Statistical Software,43/4, 1-25, available online at http://www.jstatsoft.org/v43/i04/.

Moran MS, Jackson RD, Slater PN, Teillet PM (1992) Evlauation of simplified procedures for rretrieval of land surface reflectane factors from satellite sensor output.Remote Sensing of Environment 41/2-3, 169-184, doi:10.1016/0034-4257(92)90076-V, available online at http://www.sciencedirect.com/science/article/pii/003442579290076V.

Song C, Woodcock CE, Seto KC, Lenney MP, Macomber SA (2001) Classification and Change Detection Using Landsat TM Data: When and How to Correct Atmospheric Effects? Remote Sensing of Environment 75/2, doi:10.1016/S0034-4257(00)00169-3, available online at http://www.sciencedirect.com/science/article/pii/S0034425700001693

If you refer to Sawyer and Stephen 2014, please note that eq. 5 is wrong.

See Also

This function is used by calcAtmosCorr to compute the path radiance.

Examples

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
path <- system.file("extdata", package = "satellite")
files <- list.files(path, pattern = glob2rx("LC8*.tif"), full.names = TRUE)
sat <- satellite(files)
sat <- calcTOAIrradModel(sat)

bcde <- "B002n"

sat <- calcTOAIrradRadRef(sat, normalize = FALSE)

## performance of base-R
system.time(
 val1 <- calcPathRadDOS(x = min(getValues(getSatDataLayer(sat, bcde))),
                bnbr = getSatLNBR(sat, bcde),
                band_wls = data.frame(LMIN = getSatLMIN(sat, getSatBCDESolar(sat)),
                                      LMAX = getSatLMAX(sat, getSatBCDESolar(sat))),
                radm = getSatRADM(sat, getSatBCDESolar(sat)),
                rada = getSatRADA(sat, getSatBCDESolar(sat)),
                szen = getSatSZEN(sat, getSatBCDESolar(sat)),
                esun = getSatESUN(sat, getSatBCDESolar(sat)),
                model = "DOS2",
                scat_coef = -4, use_cpp = FALSE)
)

## and Rcpp version
system.time(
 val2 <- calcPathRadDOS(x = min(getValues(getSatDataLayer(sat, bcde))),
                bnbr = getSatLNBR(sat, bcde),
                band_wls = data.frame(LMIN = getSatLMIN(sat, getSatBCDESolar(sat)),
                                      LMAX = getSatLMAX(sat, getSatBCDESolar(sat))),
                radm = getSatRADM(sat, getSatBCDESolar(sat)),
                rada = getSatRADA(sat, getSatBCDESolar(sat)),
                szen = getSatSZEN(sat, getSatBCDESolar(sat)),
                esun = getSatESUN(sat, getSatBCDESolar(sat)),
                model = "DOS2",
                scat_coef = -4, use_cpp = TRUE)
)

Want to suggest features or report bugs for rdrr.io? Use the GitHub issue tracker.