You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效重网格化多光谱图像?(附具体维度与波长参数)

多光谱图像高效重网格化实现(无单波长遍历)

问题背景

给定形状为 [240, 320, 30] 的多光谱图像数组:

import numpy as np
a = np.random.random([240, 320, 30])

其最后一维对应的原始分数波长为:

orig_wavelengths = np.array([395.13, 408.62, 421.63, 434.71, 435.64, 453.39, 456.88, 471.48,
       484.23, 488.89, 497.88, 513.35, 521.38, 528.19, 539.76, 548.39,
       557.78, 568.06, 577.64, 590.22, 598.63, 613.13, 618.87, 632.75,
       637.5 , 647.47, 655.6 , 672.66, 681.88, 690.1 ])

需要高效重网格化至目标整数波长:

target_wavelengths = np.array([400, 410, 420, 430, 440, 450, 460, 470, 480, 490, 500, 510, 520,
       530, 540, 550, 560, 570, 580, 590, 600, 610, 620, 630, 640, 650,
       660, 670, 680, 690])

要求不遍历单个波长,完全依赖向量化操作实现高效计算。

解决方案:基于NumPy向量化线性插值

利用NumPy的广播机制和线性插值原理,直接对整个数组进行批量计算,避免循环遍历。

实现代码

import numpy as np

# 1. 定位每个目标波长在原始波长序列中的相邻左侧索引
indices = np.searchsorted(orig_wavelengths, target_wavelengths, side='right') - 1
# 裁剪索引,避免越界
indices = np.clip(indices, 0, len(orig_wavelengths)-2)

# 2. 获取相邻的原始波长及对应图像数据
left_wv = orig_wavelengths[indices]
right_wv = orig_wavelengths[indices + 1]
left_data = a[..., indices]
right_data = a[..., indices + 1]

# 3. 计算插值权重,扩展维度适配广播
weights = (target_wavelengths - left_wv) / (right_wv - left_wv)
weights = weights[np.newaxis, np.newaxis, :]

# 4. 批量执行线性插值
regridded_a = (1 - weights) * left_data + weights * right_data

代码说明

  • np.searchsorted:向量化快速定位目标波长的相邻原始波长索引,无循环操作。
  • 索引裁剪:处理目标波长超出原始波长范围的边界情况,避免索引越界。
  • 广播机制:将权重数组扩展为[1,1,30]形状,自动匹配图像数组的[240,320,30]维度,实现逐像素逐波长的批量计算。
  • 线性插值:通过权重比例混合左右相邻波长的图像数据,得到目标波长的插值结果。

结果验证

最终regridded_a的形状为[240,320,30],与原数组一致,每个通道对应目标整数波长的插值结果。整个过程依赖NumPy底层优化,效率远高于单波长遍历方式。

内容的提问来源于stack exchange,提问作者Kel Solaar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 03:03:36