如何高效重网格化多光谱图像?(附具体维度与波长参数)
多光谱图像高效重网格化实现(无单波长遍历)
问题背景
给定形状为 [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
相关产品推荐
相关产品推荐

