NISAR satellite backscatter coefficient image generation
NISAR satellite backscatter coefficient image generation
Dear Sir or Madam,
Recent launched NISAR satellite gives a new insight of earth surface dynamics by L-band and S-band SAR sensors. I have checked the public data products released by NASA Earthdata and Alaska Satellite Facility, and find that backscatter coefficient data are not included. Therefore, I utilized two polarization modes "HH" and "HV" within "frequencyA" group of the Geocoded Single Look Complex (GSLC) product (filename: "NISAR_L2_PR_GSLC_003_128_D_068_4005_DHDH_A_20251026T020535_20251026T020610_X05009_N_F_J_001.h5") to generate backscatter coefficient image as a demonstration with following steps:
(1) single look complex to intensity: Intensity = I² + R², where "I" means the imaginary part of the "HH" or "HV" polarization in frequencyA group. "R" means the real part of the "HH" or "HV" polarization in frequencyA group.
(2) intensity to linear backscatter coefficient: sigma_naught_linear = gain * intensity, where "sigma_naught_linear" means linear backscatter coefficient, "gain" means calibration constant which is obtained from "scaleFactor" field of each polarization mode.
(3) linear to decibel conversion: sigma_naught_decibel = 10 * log10(sigma_naught_linear), where "sigma_naught_decibel" means final generated backscatter coefficient image.
Final generated "HH" and "HV" backscatter coefficient images and comparison with simultaneous Sentinel-1 VV image are shown in figure "NISAR_HH_and_Sentinel_VV.png" and "NISAR_HV_and_Sentinel_VV.png", respectively. Also, previous studies pointed out that thermal noise (e.g., Mascolo et al., 2021) needs to be removed for backscatter coefficient generation of Sentinel-1 satellite, but I am not sure does this issue also exist in the NISAR satellite. Any suggestion and guidance about backscatter coefficient image generation procedure of NISAR satellite described herein is welcome.
Thanks advance for your time.
Cheers,
Jw
References:
[1] Mascolo, L., Lopez-Sanchez, J. M., & Cloude, S. R. (2021). Thermal noise removal from polarimetric Sentinel-1 data. IEEE Geoscience and Remote Sensing Letters, 19, 1-5.
Recent launched NISAR satellite gives a new insight of earth surface dynamics by L-band and S-band SAR sensors. I have checked the public data products released by NASA Earthdata and Alaska Satellite Facility, and find that backscatter coefficient data are not included. Therefore, I utilized two polarization modes "HH" and "HV" within "frequencyA" group of the Geocoded Single Look Complex (GSLC) product (filename: "NISAR_L2_PR_GSLC_003_128_D_068_4005_DHDH_A_20251026T020535_20251026T020610_X05009_N_F_J_001.h5") to generate backscatter coefficient image as a demonstration with following steps:
(1) single look complex to intensity: Intensity = I² + R², where "I" means the imaginary part of the "HH" or "HV" polarization in frequencyA group. "R" means the real part of the "HH" or "HV" polarization in frequencyA group.
(2) intensity to linear backscatter coefficient: sigma_naught_linear = gain * intensity, where "sigma_naught_linear" means linear backscatter coefficient, "gain" means calibration constant which is obtained from "scaleFactor" field of each polarization mode.
(3) linear to decibel conversion: sigma_naught_decibel = 10 * log10(sigma_naught_linear), where "sigma_naught_decibel" means final generated backscatter coefficient image.
Final generated "HH" and "HV" backscatter coefficient images and comparison with simultaneous Sentinel-1 VV image are shown in figure "NISAR_HH_and_Sentinel_VV.png" and "NISAR_HV_and_Sentinel_VV.png", respectively. Also, previous studies pointed out that thermal noise (e.g., Mascolo et al., 2021) needs to be removed for backscatter coefficient generation of Sentinel-1 satellite, but I am not sure does this issue also exist in the NISAR satellite. Any suggestion and guidance about backscatter coefficient image generation procedure of NISAR satellite described herein is welcome.
Thanks advance for your time.
Cheers,
Jw
References:
[1] Mascolo, L., Lopez-Sanchez, J. M., & Cloude, S. R. (2021). Thermal noise removal from polarimetric Sentinel-1 data. IEEE Geoscience and Remote Sensing Letters, 19, 1-5.
- Attachments
-
- NISAR_HV_and_Sentinel_VV.png
-
- NISAR_HH_and_Sentinel_VV.png
Thanks for your post. Your approach to convert the GSLC backscatter to sigma-0 is not correct.
The RSLC and subsequently GSLC are provided as Beta-0 with respect to an ellipsoid. If you want to convert to sigma-0 you must use the sigma-0 correction factor which is included in theGSLC products at the following path:
['science/LSAR/GSLC/metadata/calibrationInformation/geometry/sigma0']
This is a low resolution two dimensional look up table whose 1-D vector of coordinates are also provided as
h5['science/LSAR/GSLC/metadata/calibrationInformation/geometry/xCoordinates']
h5['science/LSAR/GSLC/metadata/calibrationInformation/geometry/yCoordinates']
The user needs to create an interpolator for this low resolution 2D LUT and interpolate for the grid of GSLC data. Once the interpolated sigma0_correction_factor is obtained, then you can get the sigma0 as:
sigma0 = abs(GSLC)**2 / sigma0_correction_factor**2
This can then be converted to dB as
sigma0_db = 10*log10(sigma0)
Please see section 4.5.2.1 in the product specification document for GSLC in the following path:
https://d1mv8zhcvry6x4.cloudfront.net/s3-7fdfbcb0ce308dc58d08f97acb1f0590/sds-n-cumulus-prod-nisar-sample-data.s3.us-west-2.amazonaws.com/DOCS/NISAR_D-102269_RevE_NASA_SDS_Product_Specification_L2_GSLC_Nov8_2024_w-sigs.pdf?A-userid=hfattahi&Expires=1773298713&Signature=Ty1m8Rl3kA9WHxSOq1PYZXN3eqDkvkR0eZPSjsY3dFgIuCG2pJQovTu4SsOs5k1qdtNXlY9g7h0FvB~Iw0kyNMzz3kWgrjtXan2~TwdIijhmqWcUrjY5XcMqMrc3il2VsKb1UiVPo6ySIgVeyFIbe0CNWC6H~JmdC3n7IN1-kOrrDKU3Bndeqh9iK5scRs3GFUF0NNJ7TU9QF4rphPgSIrNjn0vp0cWQdX~Wr4hgorYTCAwKYCAS8OS-vF~I93vE-my4IOrm4Q~39AoKNNrvZuN5fod4-IPzZ5YV9H93UgS1klfsKDQxpZrI-xlR8cye5twAd8ydXgNX3HvzbdtUyA__&Key-Pair-Id=K1MF06CKIT7LR7
Note that you can simply use scipy for the interpolation of the LUT. Here is a code snippet for what explained above:
import h5py
import numpy as np
from scipy.interpolate import RegularGridInterpolator
h5 = h5py.File(gslc_file, 'r')
# I'm extracting a subset of GSLC data
hh = h5['science/LSAR/GSLC/grids/frequencyA/HH'][10000:40000, 10000:40000]
x = h5['science/LSAR/GSLC/grids/frequencyA/xCoordinates'][10000:40000]
y = h5['science/LSAR/GSLC/grids/frequencyA/yCoordinates'][10000:40000]
# Look Up Table (LUT) of correction factor to convert GSLC Beta-0 to sigma-0
sigma0_correction_factor = h5['science/LSAR/GSLC/metadata/calibrationInformation/geometry/sigma0'][:]
sigma0_x = h5['science/LSAR/GSLC/metadata/calibrationInformation/geometry/xCoordinates'][:]
sigma0_y = h5['science/LSAR/GSLC/metadata/calibrationInformation/geometry/yCoordinates'][:]
# Now let's create and interpolator for the LUT and interpolate it over the grid of hh data.
# 1. Create the interpolator from the low-resolution LUT
interp_func = RegularGridInterpolator(
(sigma0_y, sigma0_x),
sigma0_correction_factor,
bounds_error=False,
fill_value=None # Extrapolates if coordinates are slightly outside bounds
)
# 2. Create a grid of coordinates corresponding to your high-resolution 'hh' raster
# 'indexing=ij' ensures that yy corresponds to rows and xx to columns
yy, xx = np.meshgrid(y, x, indexing='ij')
# 3. Reshape coordinates into a list of points (N, 2) for the interpolator
pts = np.vstack([yy.ravel(), xx.ravel()]).T
# 4. Interpolate the LUT to get the correction factor for every pixel in 'hh'
correction_factor_hh = interp_func(pts).reshape(hh.shape)
# 5. Convert Beta-0 to Sigma-0
sigma0_hh = np.abs(hh)**2 / correction_factor_hh**2
Go to full postThe RSLC and subsequently GSLC are provided as Beta-0 with respect to an ellipsoid. If you want to convert to sigma-0 you must use the sigma-0 correction factor which is included in theGSLC products at the following path:
['science/LSAR/GSLC/metadata/calibrationInformation/geometry/sigma0']
This is a low resolution two dimensional look up table whose 1-D vector of coordinates are also provided as
h5['science/LSAR/GSLC/metadata/calibrationInformation/geometry/xCoordinates']
h5['science/LSAR/GSLC/metadata/calibrationInformation/geometry/yCoordinates']
The user needs to create an interpolator for this low resolution 2D LUT and interpolate for the grid of GSLC data. Once the interpolated sigma0_correction_factor is obtained, then you can get the sigma0 as:
sigma0 = abs(GSLC)**2 / sigma0_correction_factor**2
This can then be converted to dB as
sigma0_db = 10*log10(sigma0)
Please see section 4.5.2.1 in the product specification document for GSLC in the following path:
https://d1mv8zhcvry6x4.cloudfront.net/s3-7fdfbcb0ce308dc58d08f97acb1f0590/sds-n-cumulus-prod-nisar-sample-data.s3.us-west-2.amazonaws.com/DOCS/NISAR_D-102269_RevE_NASA_SDS_Product_Specification_L2_GSLC_Nov8_2024_w-sigs.pdf?A-userid=hfattahi&Expires=1773298713&Signature=Ty1m8Rl3kA9WHxSOq1PYZXN3eqDkvkR0eZPSjsY3dFgIuCG2pJQovTu4SsOs5k1qdtNXlY9g7h0FvB~Iw0kyNMzz3kWgrjtXan2~TwdIijhmqWcUrjY5XcMqMrc3il2VsKb1UiVPo6ySIgVeyFIbe0CNWC6H~JmdC3n7IN1-kOrrDKU3Bndeqh9iK5scRs3GFUF0NNJ7TU9QF4rphPgSIrNjn0vp0cWQdX~Wr4hgorYTCAwKYCAS8OS-vF~I93vE-my4IOrm4Q~39AoKNNrvZuN5fod4-IPzZ5YV9H93UgS1klfsKDQxpZrI-xlR8cye5twAd8ydXgNX3HvzbdtUyA__&Key-Pair-Id=K1MF06CKIT7LR7
Note that you can simply use scipy for the interpolation of the LUT. Here is a code snippet for what explained above:
import h5py
import numpy as np
from scipy.interpolate import RegularGridInterpolator
h5 = h5py.File(gslc_file, 'r')
# I'm extracting a subset of GSLC data
hh = h5['science/LSAR/GSLC/grids/frequencyA/HH'][10000:40000, 10000:40000]
x = h5['science/LSAR/GSLC/grids/frequencyA/xCoordinates'][10000:40000]
y = h5['science/LSAR/GSLC/grids/frequencyA/yCoordinates'][10000:40000]
# Look Up Table (LUT) of correction factor to convert GSLC Beta-0 to sigma-0
sigma0_correction_factor = h5['science/LSAR/GSLC/metadata/calibrationInformation/geometry/sigma0'][:]
sigma0_x = h5['science/LSAR/GSLC/metadata/calibrationInformation/geometry/xCoordinates'][:]
sigma0_y = h5['science/LSAR/GSLC/metadata/calibrationInformation/geometry/yCoordinates'][:]
# Now let's create and interpolator for the LUT and interpolate it over the grid of hh data.
# 1. Create the interpolator from the low-resolution LUT
interp_func = RegularGridInterpolator(
(sigma0_y, sigma0_x),
sigma0_correction_factor,
bounds_error=False,
fill_value=None # Extrapolates if coordinates are slightly outside bounds
)
# 2. Create a grid of coordinates corresponding to your high-resolution 'hh' raster
# 'indexing=ij' ensures that yy corresponds to rows and xx to columns
yy, xx = np.meshgrid(y, x, indexing='ij')
# 3. Reshape coordinates into a list of points (N, 2) for the interpolator
pts = np.vstack([yy.ravel(), xx.ravel()]).T
# 4. Interpolate the LUT to get the correction factor for every pixel in 'hh'
correction_factor_hh = interp_func(pts).reshape(hh.shape)
# 5. Convert Beta-0 to Sigma-0
sigma0_hh = np.abs(hh)**2 / correction_factor_hh**2
Filters:
-
ASF - hjkristenson
- Subject Matter Expert

- Posts: 15
- Joined: Mon Aug 08, 2022 1:41 pm America/New_York
- Endorsed: 1 time
Re: NISAR satellite backscatter coefficient image generation
Have you evaluated the GCOV products, or are you looking specifically for non-terrain-corrected data?
While the GCOV products present normalized radar backscatter in gamma-nought power, they also include a layer for conversion to sigma-nought. They also contain the calibration layers used, including noiseEquivalentBackscatter, as described in the product specification document.
While the GCOV products present normalized radar backscatter in gamma-nought power, they also include a layer for conversion to sigma-nought. They also contain the calibration layers used, including noiseEquivalentBackscatter, as described in the product specification document.
Heidi Kristenson
Senior GIS Specialist
Alaska Satellite Facility
Senior GIS Specialist
Alaska Satellite Facility
Re: NISAR satellite backscatter coefficient image generation
Hi Heidi Kristenson,
Thank you for your help! I will dig into GCOV products.
Cheers,
Jw
Thank you for your help! I will dig into GCOV products.
Cheers,
Jw
-
ASF - hjkristenson
- Subject Matter Expert

- Posts: 15
- Joined: Mon Aug 08, 2022 1:41 pm America/New_York
- Endorsed: 1 time
Re: NISAR satellite backscatter coefficient image generation
If you're interested in comparing the NISAR GCOV products to similar Sentinel-1 data, the OPERA RTC-S1 products provide terrain-corrected radar backscatter in gamma-nought power for Sentinel-1 acquisitions.
Heidi Kristenson
Senior GIS Specialist
Alaska Satellite Facility
Senior GIS Specialist
Alaska Satellite Facility
Re: NISAR satellite backscatter coefficient image generation
Thanks again for your help! I notice that current NISAR Beta Geocoded Polarimetric Covariance Product (Version 1) is not intended for use in scientific research, thus I am just gaining familiarity with it.
Have a nice day!
Cheers,
Jw
Have a nice day!
Cheers,
Jw
-
ASF - bhauer
- User Services

- Posts: 47
- Joined: Thu Dec 12, 2024 5:54 pm America/New_York
Re: NISAR satellite backscatter coefficient image generation
You are correct. The NISAR products released to date are uncalibrated data intended to help users become familiar with the data and develop workflows. The fully calibrated, global data release is scheduled for June 2026.
Thanks for your input!
Thanks for your input!
Re: NISAR satellite backscatter coefficient image generation
Thanks for your post. Your approach to convert the GSLC backscatter to sigma-0 is not correct.
The RSLC and subsequently GSLC are provided as Beta-0 with respect to an ellipsoid. If you want to convert to sigma-0 you must use the sigma-0 correction factor which is included in theGSLC products at the following path:
['science/LSAR/GSLC/metadata/calibrationInformation/geometry/sigma0']
This is a low resolution two dimensional look up table whose 1-D vector of coordinates are also provided as
h5['science/LSAR/GSLC/metadata/calibrationInformation/geometry/xCoordinates']
h5['science/LSAR/GSLC/metadata/calibrationInformation/geometry/yCoordinates']
The user needs to create an interpolator for this low resolution 2D LUT and interpolate for the grid of GSLC data. Once the interpolated sigma0_correction_factor is obtained, then you can get the sigma0 as:
sigma0 = abs(GSLC)**2 / sigma0_correction_factor**2
This can then be converted to dB as
sigma0_db = 10*log10(sigma0)
Please see section 4.5.2.1 in the product specification document for GSLC in the following path:
https://d1mv8zhcvry6x4.cloudfront.net/s3-7fdfbcb0ce308dc58d08f97acb1f0590/sds-n-cumulus-prod-nisar-sample-data.s3.us-west-2.amazonaws.com/DOCS/NISAR_D-102269_RevE_NASA_SDS_Product_Specification_L2_GSLC_Nov8_2024_w-sigs.pdf?A-userid=hfattahi&Expires=1773298713&Signature=Ty1m8Rl3kA9WHxSOq1PYZXN3eqDkvkR0eZPSjsY3dFgIuCG2pJQovTu4SsOs5k1qdtNXlY9g7h0FvB~Iw0kyNMzz3kWgrjtXan2~TwdIijhmqWcUrjY5XcMqMrc3il2VsKb1UiVPo6ySIgVeyFIbe0CNWC6H~JmdC3n7IN1-kOrrDKU3Bndeqh9iK5scRs3GFUF0NNJ7TU9QF4rphPgSIrNjn0vp0cWQdX~Wr4hgorYTCAwKYCAS8OS-vF~I93vE-my4IOrm4Q~39AoKNNrvZuN5fod4-IPzZ5YV9H93UgS1klfsKDQxpZrI-xlR8cye5twAd8ydXgNX3HvzbdtUyA__&Key-Pair-Id=K1MF06CKIT7LR7
Note that you can simply use scipy for the interpolation of the LUT. Here is a code snippet for what explained above:
import h5py
import numpy as np
from scipy.interpolate import RegularGridInterpolator
h5 = h5py.File(gslc_file, 'r')
# I'm extracting a subset of GSLC data
hh = h5['science/LSAR/GSLC/grids/frequencyA/HH'][10000:40000, 10000:40000]
x = h5['science/LSAR/GSLC/grids/frequencyA/xCoordinates'][10000:40000]
y = h5['science/LSAR/GSLC/grids/frequencyA/yCoordinates'][10000:40000]
# Look Up Table (LUT) of correction factor to convert GSLC Beta-0 to sigma-0
sigma0_correction_factor = h5['science/LSAR/GSLC/metadata/calibrationInformation/geometry/sigma0'][:]
sigma0_x = h5['science/LSAR/GSLC/metadata/calibrationInformation/geometry/xCoordinates'][:]
sigma0_y = h5['science/LSAR/GSLC/metadata/calibrationInformation/geometry/yCoordinates'][:]
# Now let's create and interpolator for the LUT and interpolate it over the grid of hh data.
# 1. Create the interpolator from the low-resolution LUT
interp_func = RegularGridInterpolator(
(sigma0_y, sigma0_x),
sigma0_correction_factor,
bounds_error=False,
fill_value=None # Extrapolates if coordinates are slightly outside bounds
)
# 2. Create a grid of coordinates corresponding to your high-resolution 'hh' raster
# 'indexing=ij' ensures that yy corresponds to rows and xx to columns
yy, xx = np.meshgrid(y, x, indexing='ij')
# 3. Reshape coordinates into a list of points (N, 2) for the interpolator
pts = np.vstack([yy.ravel(), xx.ravel()]).T
# 4. Interpolate the LUT to get the correction factor for every pixel in 'hh'
correction_factor_hh = interp_func(pts).reshape(hh.shape)
# 5. Convert Beta-0 to Sigma-0
sigma0_hh = np.abs(hh)**2 / correction_factor_hh**2
The RSLC and subsequently GSLC are provided as Beta-0 with respect to an ellipsoid. If you want to convert to sigma-0 you must use the sigma-0 correction factor which is included in theGSLC products at the following path:
['science/LSAR/GSLC/metadata/calibrationInformation/geometry/sigma0']
This is a low resolution two dimensional look up table whose 1-D vector of coordinates are also provided as
h5['science/LSAR/GSLC/metadata/calibrationInformation/geometry/xCoordinates']
h5['science/LSAR/GSLC/metadata/calibrationInformation/geometry/yCoordinates']
The user needs to create an interpolator for this low resolution 2D LUT and interpolate for the grid of GSLC data. Once the interpolated sigma0_correction_factor is obtained, then you can get the sigma0 as:
sigma0 = abs(GSLC)**2 / sigma0_correction_factor**2
This can then be converted to dB as
sigma0_db = 10*log10(sigma0)
Please see section 4.5.2.1 in the product specification document for GSLC in the following path:
https://d1mv8zhcvry6x4.cloudfront.net/s3-7fdfbcb0ce308dc58d08f97acb1f0590/sds-n-cumulus-prod-nisar-sample-data.s3.us-west-2.amazonaws.com/DOCS/NISAR_D-102269_RevE_NASA_SDS_Product_Specification_L2_GSLC_Nov8_2024_w-sigs.pdf?A-userid=hfattahi&Expires=1773298713&Signature=Ty1m8Rl3kA9WHxSOq1PYZXN3eqDkvkR0eZPSjsY3dFgIuCG2pJQovTu4SsOs5k1qdtNXlY9g7h0FvB~Iw0kyNMzz3kWgrjtXan2~TwdIijhmqWcUrjY5XcMqMrc3il2VsKb1UiVPo6ySIgVeyFIbe0CNWC6H~JmdC3n7IN1-kOrrDKU3Bndeqh9iK5scRs3GFUF0NNJ7TU9QF4rphPgSIrNjn0vp0cWQdX~Wr4hgorYTCAwKYCAS8OS-vF~I93vE-my4IOrm4Q~39AoKNNrvZuN5fod4-IPzZ5YV9H93UgS1klfsKDQxpZrI-xlR8cye5twAd8ydXgNX3HvzbdtUyA__&Key-Pair-Id=K1MF06CKIT7LR7
Note that you can simply use scipy for the interpolation of the LUT. Here is a code snippet for what explained above:
import h5py
import numpy as np
from scipy.interpolate import RegularGridInterpolator
h5 = h5py.File(gslc_file, 'r')
# I'm extracting a subset of GSLC data
hh = h5['science/LSAR/GSLC/grids/frequencyA/HH'][10000:40000, 10000:40000]
x = h5['science/LSAR/GSLC/grids/frequencyA/xCoordinates'][10000:40000]
y = h5['science/LSAR/GSLC/grids/frequencyA/yCoordinates'][10000:40000]
# Look Up Table (LUT) of correction factor to convert GSLC Beta-0 to sigma-0
sigma0_correction_factor = h5['science/LSAR/GSLC/metadata/calibrationInformation/geometry/sigma0'][:]
sigma0_x = h5['science/LSAR/GSLC/metadata/calibrationInformation/geometry/xCoordinates'][:]
sigma0_y = h5['science/LSAR/GSLC/metadata/calibrationInformation/geometry/yCoordinates'][:]
# Now let's create and interpolator for the LUT and interpolate it over the grid of hh data.
# 1. Create the interpolator from the low-resolution LUT
interp_func = RegularGridInterpolator(
(sigma0_y, sigma0_x),
sigma0_correction_factor,
bounds_error=False,
fill_value=None # Extrapolates if coordinates are slightly outside bounds
)
# 2. Create a grid of coordinates corresponding to your high-resolution 'hh' raster
# 'indexing=ij' ensures that yy corresponds to rows and xx to columns
yy, xx = np.meshgrid(y, x, indexing='ij')
# 3. Reshape coordinates into a list of points (N, 2) for the interpolator
pts = np.vstack([yy.ravel(), xx.ravel()]).T
# 4. Interpolate the LUT to get the correction factor for every pixel in 'hh'
correction_factor_hh = interp_func(pts).reshape(hh.shape)
# 5. Convert Beta-0 to Sigma-0
sigma0_hh = np.abs(hh)**2 / correction_factor_hh**2
Re: NISAR satellite backscatter coefficient image generation
Thank you for your detailed explanation and code example of backscatter coefficient image generation from GSLC product. I will give it a try in these days.
Thanks again for your kindness and help!
Cheers,
Jw
Thanks again for your kindness and help!
Cheers,
Jw
-
ASF - hjkristenson
- Subject Matter Expert

- Posts: 15
- Joined: Mon Aug 08, 2022 1:41 pm America/New_York
- Endorsed: 1 time
Re: NISAR satellite backscatter coefficient image generation
If that link doesn't work for you, try this:
https://nisar.asf.earthdatacloud.nasa.gov/NISAR-SAMPLE-DATA/DOCS/NISAR_D-102269_RevE_NASA_SDS_Product_Specification_L2_GSLC_Nov8_2024_w-sigs.pdf
Heidi Kristenson
Senior GIS Specialist
Alaska Satellite Facility
Senior GIS Specialist
Alaska Satellite Facility