IDL&python学习——实现两景影像中有效值的均值合成

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

最近在处理MCD19A2数据,从我上一篇博客得知,处理之后的MCD19A2数据的存储方式是4波段的栅格文件,一个波段对应一个时间,但是查看每一个时间(波段)的有效值发现并不是能全部分布,如下图:

第一波段:                                                                             第二波段:

  

 第三波段:                                                                           第四波段:

  

        一般来说,第二波段的有效值最多,如果嫌麻烦可以直接提取第二波段的数据作为结果。我这里想把4个波段做一个有效值的均值计算。

      比如说这个栅格数据是4个波段,但同一处像元上不是每一个值都是有值的,见下图:

       

 可以看见第一和第四波段上的值是nodata,是无效值,这两个值是不参与计算的,也就是说如果要算这个像元的有效值均值,只参与计算的是第三波段和第二波段的值,即(60+119)/2=89.5,而不是(60+119)/4=44.75

1.python中实现两景影像的有效值均值计算。

这里的测试数据我是拿MRT校正出来的MCD19A2数据,B2_TIF和B3_TIF就是校正出来的第二波段和第三波段的TIF,这里的无效值为-28672。

import numpy as np
from osgeo import gdal
B2_TIF=r'G:\0test\mcd19a2.Optical_Depth_055.Orbits_02.tif'
B3_TIF=r'G:\0test\mcd19a2.Optical_Depth_055.Orbits_03.tif'
B2_data=gdal.Open(B2_TIF)
B3_data=gdal.Open(B3_TIF)
#读取B2TIF的值
rows1 = B2_data.RasterYSize
cols1 = B2_data.RasterXSize
band1 = B2_data.GetRasterBand(1)  # 1100 2305
b2_ds = band1.ReadAsArray(0, 0, cols1, rows1)
#读取B3TIF的值
rows2 = B3_data.RasterYSize
cols2 = B3_data.RasterXSize
band2 = B3_data.GetRasterBand(1)  # 1100 2305
b3_ds = band2.ReadAsArray(0, 0, cols1, rows1)
out_ds=np.zeros((rows1,cols1))
#因为我这里的无效值全都是小于0的值,所以我根据0值这个界限去判断这个值是否是我需要的。
#对每一个像元进行循环。
for i in range(rows1):
    for j in range(cols1):     
        #b2_ds[i,j]是无效值,b3_ds[i,j]为有效值,保留b3_ds
        if b2_ds[i,j] <= 0  and  b3_ds[i,j] > 0: 
            out_ds[i, j] = b3_ds[i, j]
        #b2_ds[i,j]是有效值,b3_ds[i,j]为无效值,保留b2_ds
        if  b3_ds[i,j] <= 0 and b2_ds[i,j] > 0:
            out_ds[i,j]=b2_ds[i,j]
        #b2_ds[i,j]是有效值,b3_ds[i,j]也为效值,进行均值计算
        if b3_ds[i, j] > 0 and b2_ds[i, j] > 0:
            out_ds[i,j]=(b2_ds[i,j]+b3_ds[i,j])/2
out_path=r'G:\0test'
outdriver = gdal.GetDriverByName('GTiff')
outds = outdriver.Create(out_path + '\\' +'AOD_mean.tif', cols1, rows1, 1,gdal.GDT_Float32)
band3:gdal.Band= outds.GetRasterBand(1)
band3.WriteArray(out_ds)
outds=None





 结果如下,这里是直接自动向上取整了。

      

这里设置了背景值的忽略,所以-28672就显示为 no data。

          

2.IDL中实现两景影像的有效值合成:

这里的测试数据是拿MCTK处理出来的MCD19A2数据,并取出了其中第二个和第三个波段进行有效值均值合成,这里的无效值为NaN。也可以在用MCTK的过程中将填充坏值设置为一个负数。

pro mean_value
compile_opt idl2
e=envi(/headless)
raster=e.openraster('G:\000aersol\mctk_AOD.dat')
data1=raster.getdata()
;读取栅格的行列数
nb=raster.nbands
ncols=raster.NCOLUMNS
nrows=raster.NROWS
;创建一个跟原栅格相同的数组
final_value=make_array(ncols,nrows)  
for b=0,ncols-1 do begin
  for c=0,nrows-1 do begin
    ;创建一个二维浮点型数组
    data_effect=fltarr(2)
    ;分别读取两个波段的像元值
    data_judge0=(data1[b,c,0] GE 0 )
    data_judge1=(data1[b,c,1] GE 0 )
    ;将同一个像元不同两个波段的像元值放在一个数组里面,方便后面计算
    data_effect=[data1[b,c,0],data1[b,c,1]]
    ;剔除掉不需要的影像值,这里的无效值是 nan
    youxiao_value=data_effect[where(data_effect ge 0)]
    ;进行有效值的均值合成,并将这个像元值传给跟原栅格具有相同数组的那个数组。
    final_value[b,c]=mean(youxiao_value)
  endfor
endfor    
out_value=final_value
uri='G:\0test\mctk_AOD_mean.dat'
final_raster=enviraster(out_value,uri=uri,spatialref=raster.spatialref)
final_raster.save
end

结果如下:

    

                 

 如有错误,欢迎指正,万分感谢!

### 处理MCD19A2卫星数据的方法 #### 数据下载 MCD19A2 是 MODIS 的气溶胶产品之一,通常可以通过 NASA 官方网站或其他公开平台进行下载[^1]。如果需要自动化处理大量数据,则可以考虑使用 Google Earth Engine (GEE),它提供了便捷的方式来访问和预处理这些数据。 --- #### 工具选择 对于 MCD19A2 数据的处理,可以选择多种工具和技术栈来完成任务: 1. **IDL**: IDL 提供了一种高效的方式来进行多维数组操作,尤其是针对遥感图像中的波段合成与滤波。通过循环遍历像素并计算有效值均值,能够实现复杂的数据融合过程[^2]。 下面是一个简单的 IDL 实现示例: ```idl for b=0,ncols-1 do begin for c=0,nrows-1 do begin data_effect=fltarr(nb) for d=0,nb-1 do begin data_effect[d]=data[b,c,d] endfor data_effect=data_effect[where(data_effect ge 0 and data_effect lt 50)] final_value[b,c]=mean(data_effect) endfor endfor ``` 2. **Python**: Python 生态中有许多强大的库支持遥感数据分析,例如 `rasterio` 和 `numpy` 可用于读取栅格文件;而 `pandas` 则适合于时间序列分析。此外,还可以借助 GEE API 来简化云端运算流程[^3]。 示例代码展示如何加载本地 HDF 文件并通过 NumPy 进行初步探索: ```python import h5py import numpy as np # 打开HDF文件 hdf_file = 'path_to_your_MCD19A2.hdf' with h5py.File(hdf_file, 'r') as f: datasets = list(f.keys()) print(datasets) # 查看可用数据集名称 # 假设我们要提取第一个子数据集 dataset_name = datasets[0] data_array = f[dataset_name][:] # 对数据执行基本统计 valid_data = data_array[(data_array >= 0) & (data_array < 50)] # 排除无效范围外的数值 mean_value = np.mean(valid_data) std_deviation = np.std(valid_data) print(f"Mean AOD Value: {mean_value}") print(f"AOD Standard Deviation: {std_deviation}") ``` 3. **Google Earth Engine (GEE)**: 如果希望减少对硬件资源的需求或者快速生成大规模区域的结果,那么基于云计算的服务如 GEE 将是非常理想的选择。它可以轻松过滤掉不需要的时间点(比如含云覆盖的日子),并对整个研究区应用统一的标准算法[^3]。 配合 JavaScript 编写的脚本如下所示: ```javascript var collection = ee.ImageCollection('MODIS/006/MCD19A2') .filterDate('2022-01-01', '2022-12-31') .select('Optical_Depth_047'); // 选取特定波段 function maskClouds(image){ var qa = image.select('QC'); return image.updateMask(qa.eq(0)); // 假定质量标志等于零表示无云条件 } var filtered = collection.map(maskClouds); var aodStats = filtered.reduce(ee.Reducer.mean()); Map.addLayer(aodStats, {}, 'Annual Mean AOD'); Export.image.toDrive({ image: aodStats, description: 'Beijing_Annual_AOD', scale: 1000, region: geometry }); ``` --- ### 总结 无论是采用传统桌面端软件还是现代在线服务平台,每种方法都有其独特的优势。具体选用哪种取决于个人偏好、项目需求以及现有基础设施状况等因素。上述提到的技术均可胜任从基础可视化到高级建模的各种场下的工作负荷。 问题
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三十二号星期八

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值