高光谱数据的平场校正



我正在使用spectral python库处理高光谱数据集。周一,我第一次开始使用python,所以一切都花了我很长时间。

我的数据是envi格式的,我相信我已经成功地读取了它,并将其转换为numpy数组。

我正在尝试使用此代码进行平场校正

corrected_nparr = np.divide(np.subtract(data_nparr, dark_nparr), np.subtract(white_nparr, dark_nparr))
ValueError: operands could not be broadcast together with shapes (1367,384,288) (100,384,288)

这不起作用,因为我的白色引用和深色引用的大小与数据捕获不同。

print(white_nparr.shape)
(297, 384, 288)
print(dark_nparr.shape)
(100, 384, 288)
print(data_nparr.shape)
(1367, 384, 288)

所以,我理解我为什么会出错。原始的白色和深色参考是使用数据集的不同图像大小捕获的。因此,我的问题是为数据集创建一个更正,同时只能访问不同大小的引用

以前有人处理过这个吗?你用了什么方法?

顺便说一句,我使用的数据是从岩芯中采集的矿物高光谱数据,爱尔兰地质调查局拥有一个庞大的数据集,可根据要求免费提供

因此,我收到了一个非常有用的答案,这实际上引发了的进一步问题

# created these files to broadcast as they are a horizontal line of spectra,
#a 2D array which captures the variation 
white_nparr_horiz = white_nparr[-2] 
dark_nparr_horiz = dark_nparr[-2] 
corrected_nparr = np.divide(np.subtract(data_nparr, dark_nparr_horiz), np.subtract(white_nparr_horiz, dark_nparr_horiz)) 
white_nparr_horiz.shape 
Out[28]: (384, 288) 
dark_nparr_horiz.shape Out[29]: (384, 288) 

因此,这些数组的形状可以根据data_ref进行广播,我已经在几个不同的索引上测试了它的工作原理,并且确实如此。

a = white_nparr_horiz[150, 144]
b = dark_nparr_horiz[150, 144]
c = data_nparr[500, 150, 144]
d = (c - b)/(a-b)
test = d == corrected_nparr[500, 150, 144]
print(test)

这个输出看起来更像我所期望的这种材料的反射率数据,所以我相信我走在了正确的道路上。

我现在想做的是让white_nparr_horiz是white_ref(297384288(中沿着原始第一轴的每个带的平均值,以(384288(的数组返回,而不是我现在认为的单个值。我确信这是可能的,但我不知道怎么做。

正如我上面所说,对于python、numpy和图像分析来说,这是非常新的,所以如果这是显而易见的,或者我走错了方向,请道歉

问题是,你的白色和深色参考应该都是一个单一的光谱(具有288个值的1D阵列(,而你的都是三维阵列(可能对应于图像区域(。要将它们转换为1D,可以根据需要计算每个数组的平均值、最大值或最小值。例如,要取暗参考的最小值和白参考的最大值,可以将它们转换如下:

dark_nparr = np.min(dark_nparr.reshape(-1, dark_nparr.shape[-1]), axis=0)
white_nparr = np.max(white_nparr.reshape(-1, white_nparr.shape[-1]), axis=0)

上面的线将阵列重塑为二维,并计算重塑阵列的最大值(或最小值(。

如果您更喜欢使用每个阵列的光谱平均值,只需将上面的np.maxnp.min替换为np.mean

如果你希望每个阵列在其第一维度上取平均值,那么(即,具有形状(384288((,那么在进行归约时不要重塑阵列。

dark_nparr = np.min(dark_nparr, axis=0)
white_nparr = np.max(white_nparr, axis=0)

最新更新