高分一号WFV3数据在大气校正前需要进行什么操作
时间: 2024-04-21 08:27:04 浏览: 102
高分一号WFV3数据在大气校正前需要进行以下操作:
1. 进行辐射定标,将原始的数字值转换为辐射值;
2. 进行几何定位,确定每个像元在地球表面的位置;
3. 进行大气校正前的预处理,包括去除散斑、条纹等噪声;
4. 进行亮温计算,将辐射值转换为亮温值;
5. 进行大气校正前的归一化处理,将亮温值归一化到同一尺度上。
相关问题
使用Py6S模型实现高分一号WFV3数据的大气校正,显示具体操作步骤和代码
Py6S是一个用于大气校正和辐射传输模拟的Python接口,可以用于处理多种遥感数据,包括高分一号WFV3数据。下面是使用Py6S模型实现高分一号WFV3数据的大气校正的基本步骤和代码示例:
1. 安装Py6S
如果你还没有安装Py6S,可以使用以下命令安装:
```
pip install py6s
```
2. 导入必要的库和数据
导入Py6S和需要处理的高分一号WFV3数据。这里假设高分一号WFV3数据已经被裁剪成一个小的区域,并且存储在名为"sample.tif"的文件中。
```python
import numpy as np
from osgeo import gdal
import spectral
import Py6S
# 导入高分一号WFV3数据
data_path = 'sample.tif'
data = gdal.Open(data_path)
# 获取数据的基本信息
cols = data.RasterXSize
rows = data.RasterYSize
bands = data.RasterCount
geo_transform = data.GetGeoTransform()
projection = data.GetProjection()
# 将数据转换为numpy数组
data_array = np.zeros((rows, cols, bands))
for b in range(bands):
band = data.GetRasterBand(b+1)
data_array[:,:,b] = band.ReadAsArray()
```
3. 设置6S模型参数
在使用Py6S模型进行大气校正之前,需要设置6S模型的参数。这些参数包括大气模型、天顶角、水汽含量等。这里我们使用标准大气模型(ATMOSPHERE_PREDEFINED)和默认的天顶角(0度)和水汽含量(1.5cm)。
```python
# 设置6S模型参数
SixS = Py6S.SixS()
SixS.atmos_profile = Py6S.AtmosProfile.PredefinedType(Py6S.AtmProfileType.Tropical)
SixS.aot550 = 0.1
SixS.altitudes.set_sensor_satellite_level()
```
4. 大气校正
使用Py6S模型进行大气校正的主要步骤是遍历数据的每个像素,并根据像素的位置和大气参数计算反射率。下面是一个简单的代码示例:
```python
# 遍历每个像素并进行大气校正
output_array = np.zeros((rows, cols, bands))
for y in range(rows):
for x in range(cols):
pixel_rad = data_array[y, x, :]
if np.sum(pixel_rad) > 0:
SixS.geometry.solar_z = 0
SixS.geometry.view_z = 0
SixS.geometry.view_a = 0
SixS.altitudes.set_sensor_satellite_level()
SixS.wavelength = spectral.envi_header wavelengths
SixS.run()
output_array[y, x, :] = SixS.outputs.values.atmospheric_intrinsic_reflectance
```
5. 保存结果
最后,将处理后的数据保存为GeoTIFF格式。
```python
# 保存结果
driver = gdal.GetDriverByName('GTiff')
out_data = driver.Create('sample_output.tif', cols, rows, bands, gdal.GDT_Float32)
out_data.SetGeoTransform(geo_transform)
out_data.SetProjection(projection)
for b in range(bands):
out_band = out_data.GetRasterBand(b+1)
out_band.WriteArray(output_array[:,:,b])
out_band.FlushCache()
```
这就是使用Py6S模型对高分一号WFV3数据进行大气校正的基本步骤和代码示例。
使用Py6S模型实现高分一号WFV3数据的大气校正通过研究区的范围求DEM高度
使用Py6S模型实现高分一号WFV3数据的大气校正,可以按照以下步骤进行:
1. 安装Py6S模块:在Python环境下,使用pip install py6s安装Py6S模块。
2. 准备数据:下载高分一号WFV3数据,并使用相关软件读取数据。
3. 设置6S模型参数:根据研究区的纬度、经度、日期、时间、太阳天顶角、卫星天顶角、相对方位角、大气气溶胶光学厚度等参数,设置6S模型参数。
4. 实现大气校正:使用6S模型计算研究区中每个像元的大气校正系数,对数据进行大气校正。
5. 求解DEM高度:在研究区的范围内,使用遥感数据或测量数据建立DEM模型,从而得到该区域内地形的高程信息。
具体实现过程可以参考以下代码:
```python
import numpy as np
from Py6S import *
from osgeo import gdal
# 设置6S模型参数
def set_6s_parameters(latitude, longitude, datetime, altitude, solar_z, view_z, relative_az, aot):
s = SixS()
s.altitudes.set_sensor_satellite_level()
s.geometry.solar_z = solar_z
s.geometry.view_z = view_z
s.geometry.relative_azimuth = relative_az
s.geometry.lat = latitude
s.geometry.lon = longitude
s.altitudes.set_sensor_satellite_level()
s.altitudes.set_target_custom_altitude(altitude)
s.aero_profile = AeroProfile.PredefinedType(AeroProfile.Maritime)
s.atmos_profile = AtmosProfile.UserWaterAndOzone(datetime.month, aot)
s.wavelength = Wavelength(PredefinedWavelengths.Landsat_TM_B1)
s.aot550 = aot
s.run()
return s.outputs.transmittance_total, s.outputs.downward_radiance, s.outputs.radiance_reflected
# 实现大气校正
def atmospheric_correction(input_file, output_file, latitude, longitude, date, time, altitude, aot):
# 读取高分一号WFV3数据
dataset = gdal.Open(input_file)
metadata = dataset.GetMetadata()
solar_z = float(metadata['SUN_ELEVATION'])
band_num = dataset.RasterCount
gt = dataset.GetGeoTransform()
pixel_size = gt[1]
view_z = np.zeros((band_num,), dtype=np.float32) + 0.01
relative_az = np.zeros((band_num,), dtype=np.float32)
for i in range(band_num):
view_z[i] = 0.01
relative_az[i] = 0.0
# 设置6S模型参数
trans, l_down, l_ref = set_6s_parameters(latitude, longitude, date, altitude, solar_z, view_z, relative_az, aot)
# 对数据进行大气校正
for i in range(band_num):
band = dataset.GetRasterBand(i + 1)
arr = band.ReadAsArray().astype(np.float32)
arr[arr == 0] = np.nan
arr *= trans[i]
arr -= l_down[i]
arr /= l_ref[i]
driver = gdal.GetDriverByName('GTiff')
outDataSet = driver.Create(output_file, dataset.RasterXSize, dataset.RasterYSize, band_num, band.DataType)
outDataSet.SetGeoTransform(gt)
outDataSet.SetProjection(dataset.GetProjection())
outBand = outDataSet.GetRasterBand(i + 1)
outBand.WriteArray(arr)
outBand.FlushCache()
# 关闭数据集
dataset = None
# 求解DEM高度
def get_dem_height(input_file, output_file):
dataset = gdal.Open(input_file)
band = dataset.GetRasterBand(1)
arr = band.ReadAsArray()
gt = dataset.GetGeoTransform()
rows, cols = arr.shape
x_arr = np.linspace(gt[0] + gt[1] / 2, gt[0] + gt[1] * (cols - 0.5), cols)
y_arr = np.linspace(gt[3] + gt[5] * (rows - 0.5), gt[3] + gt[5] / 2, rows)
xv, yv = np.meshgrid(x_arr, y_arr)
driver = gdal.GetDriverByName('GTiff')
outDataSet = driver.Create(output_file, cols, rows, 1, band.DataType)
outDataSet.SetGeoTransform(gt)
outDataSet.SetProjection(dataset.GetProjection())
outBand = outDataSet.GetRasterBand(1)
outBand.WriteArray(arr)
outBand.FlushCache()
dataset = None
# 输入数据路径
input_file = 'input.tif'
# 输出数据路径
output_file = 'output.tif'
# 研究区纬度
latitude = 30.0
# 研究区经度
longitude = 120.0
# 日期
date = datetime.datetime(2018, 7, 1, 8, 0)
# 海拔高度
altitude = 100.0
# 大气气溶胶光学厚度
aot = 0.1
# 对高分一号WFV3数据进行大气校正
atmospheric_correction(input_file, output_file, latitude, longitude, date, time, altitude, aot)
# 求解DEM高度
get_dem_height(output_file, 'dem.tif')
```
其中,input_file和output_file分别为输入数据路径和输出数据路径;latitude和longitude分别为研究区的纬度和经度;date为日期;altitude为海拔高度;aot为大气气溶胶光学厚度。在实现大气校正时,需要根据数据参数设置相应的6S模型参数,对数据进行大气校正;在求解DEM高度时,可以使用gdal库读取处理后的数据,使用遥感数据或测量数据建立DEM模型,从而得到该区域内地形的高程信息。
阅读全文