I downloaded the Landsat 9 L2 imagery from Earth Explorer for the purpose of calculating NDVI. However, when opened in ArcMap 10, the pixel values are in the range of 7000 to 45000. I understand that Surface Reflectance-derived imagery is the most suitable for NDVI and other change detection studies. Most solutions provided in forums show only how to derive TOA reflectance from DN. Do TOA reflectance and Surface reflectance mean the same thing or produce the same results? Since the bands already read LC_09_xxx_SR_T1, should they just be simply rescaled? If so, how can I accurately achieve this? And are there other alternatives to accurately derive NDVI?

  • Welcome to GIS SE. Kindly limit your post to address one question.
    – Padmanabha
    Commented Nov 5, 2023 at 18:40

2 Answers 2


From usgs.gov:

Each floating point pixel has an offset applied and then multiplied by a gain to bring the value into the 16-bit integer (or unsigned integer) range. These values are referred to as scaled integers. To allow the user to get the data back to its original floating point value, a scale factor and offset are provided for each band. The scale_factor should be applied to each pixel and then the offset added (i.e. Digital Number (DN) * scale_factor + offset).

The scale factor and offset for L2 SR products are 0.0000275 and -0.2.

enter image description here

  • Thank you for this suggestion Commented Nov 8, 2023 at 16:19
  • 1
    The method you proposed worked fine for rescaling the DN to SR values. however, my study area contains some clouds which still seem to affect the area of classified vegetation. I was hoping from little findings that the SR bands would retain values from the earth's surface regardless of whether clouds hover over that spot or not. In this case, at every spot a cloud is visible, the value is significantly deviated from the neighboring cells. Any assistance in resolving this would be greatly appreciated. Commented Nov 9, 2023 at 21:56
  • No, the satellite can't see through clouds so surface reflectance will contain clouds if they're present.
    – user2856
    Commented Nov 10, 2023 at 1:47
  • gis.stackexchange.com/help/someone-answers
    – user2856
    Commented Nov 30, 2023 at 3:36

If you want to use Python, you could use libraries designed to help you to handle satellite products such as EOReader. Reflectance conversion and spectral index computation are already handled.

from eoreader.reader import Reader
from eoreader.bands import NDVI

prod = Reader().open("your/landsat9")

# Load those bands as a dict of xarray.DataArray
ndvi = prod.load([NDVI])[NDVI]

More details in this notebook.

Disclaimer: I am the maintainer of EOReader.

  • Noted with gratitude @remi.braun Commented Nov 8, 2023 at 16:21

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.