2302_81280375 2024-04-18 20:35 采纳率: 0%
浏览 81

无人机高光谱数据进行 NDVI 计算

无人机高光谱数据进行 NDVI 计算。
高光谱数据有 512 个波段,红外波段和近红外波段都有几十个。我尝试选了很久,但算出来的数据还是很乱,没有在-1~1 之间。求解答,谢谢友友们。🙏🙏

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-18 20:35
    关注

    引自免费微信小程序:皆我百晓生

    为了计算NDVI(归一化差异植被指数Normalized Difference Vegetation Index)从无人机获取的高光谱数据,你需要选择正确的红光和近红外波段。NDVI通常使用红光波段(大约在0.6~0.7微米)和近红外波段(大约在0.8~0.9微米)之间的差值与它们的总和之比来计算。由于你的数据中有多个红外和近红外波段,可能需要实验不同的组合来找到最合适的波段。

    下面是一个Python代码示例,展示了如何从512个波段中提取特定波段范围的数据,并计算NDVI。这里我们假设红光波段位于第300到400个索引,而近红外波段位于第401到500个索引。实际应用时,请根据你的数据集调整这些范围。

    import numpy as np
    
    # 假设你的高光谱数据存储在一个名为'high_spectral_data'的numpy数组中,
    # 其形状为(高度, 宽度, 波段数)
    height, width, num_bands = high_spectral_data.shape
    
    # 提取红光和近红外波段的数据
    red_band = high_spectral_data[:, :, 300:400].mean(axis=2)  # 使用所有红光波段的平均值
    nir_band = high_spectral_data[:, :, 401:500].mean(axis=2)  # 使用所有近红外波段的平均值
    
    # 计算NDVI
    ndvi = (nir_band - red_band) / (nir_band + red_band)
    
    # 确保NDVI在-1到1之间
    ndvi_clipped = np.clip(ndvi, -1, 1)
    
    # 如果需要保存结果,可以将其写入一个新的数组
    ndvi_array = np.zeros((height, width))
    ndvi_array[:, :] = ndvi_clipped
    
    # 可以使用matplotlib显示NDVI图像
    import matplotlib.pyplot as plt
    plt.imshow(ndvi_clipped, cmap='RdYlGn')
    plt.colorbar(label='NDVI')
    plt.title('Normalized Difference Vegetation Index (NDVI)')
    plt.show()
    

    这个代码首先从高光谱数据中提取了红光和近红外波段的平均值,然后计算NDVI并确保其值在-1到1之间。最后,它会展示一个NDVI图像,颜色范围对应于-1到1的值,绿色表示植被丰富,蓝色表示较少植被或水体,红色表示干燥土壤或其他非植被区域。

    如果你发现计算出的NDVI数据依然不在预期范围内,那么可能是波段选择不正确或者数据存在其他问题。建议检查数据的原始范围,确保红光和近红外波段的选择是正确的,并且数据本身没有异常值或者噪声。如果有必要,可以尝试不同波段的组合,或者对数据进行预处理,比如平滑滤波、去除异常值等。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月18日