0

我有一个 3D 数据立方体,有两个空间维度,第三个是 2D 图像每个点的多波段光谱。

H[x, y, bands]

给定一个波长(或波段号),我想提取与该波长对应的二维图像。这将是一个简单的数组切片,如H[:,:,bnd]. 类似地,给定空间位置 (i,j),该位置的频谱为H[i,j]

我还想在光谱上“平滑”图像,以抵消光谱中的低光噪声。对于 band bnd,我选择一个大小的窗口wind并将 n 次多项式拟合到该窗口中的频谱。使用 polyfit 和 polyval 我可以在该点找到适合的光谱值 band bnd

现在,如果我想要拟合值的整个图像bnd,那么我必须在每个(i,j)图像上执行这个窗口拟合。我还想要 的二阶导数图像bnd,即每个点处拟合光谱的二阶导数的值。

在这些点上运行,我可以对每个光谱进行 polyfit-polyval-polyder x*y。虽然这可行,但这是一个逐点操作。有没有一些 pytho-numponic 方法可以更快地做到这一点?

4

1 回答 1

1

如果您对一组固定 dx 的点 (x+dx[i],y[i]) 进行最小二乘多项式拟合,然后在 x 处计算结果多项式,则结果是 y 的(固定)线性组合[一世]。多项式的导数也是如此。所以你只需要切片的线性组合。查找“Savitzky-Golay 过滤器”。

编辑添加一个简短的例子来说明 SG 过滤器是如何工作的。我没有检查任何细节,因此你不应该依赖它是正确的。

因此,假设您采用宽度为 5 和度数为 2 的滤波器。也就是说,对于每个波段(暂时忽略开头和结尾的波段),我们将在两侧取一个和两个,拟合一个二次曲线,并在中间查看它的值。

所以,如果 f(x) ~= ax^2+bx+c 和 f(-2),f(-1),f(0),f(1),f(2) = p,q,r, s,t 然后我们想要 4a-2b+c ~= p, a-b+c ~= q 等。最小二乘拟合意味着最小化 (4a-2b+cp)^2 + (a-b+cq)^ 2 + (cr)^2 + (a+b+cs)^2 + (4a+2b+ct)^2,这意味着(对 a,b,c 取偏导数):

  • 4(4a-2b+cp)+(a-b+cq)+(a+b+cs)+4(4a+2b+ct)=0
  • -2(4a-2b+cp)-(a-b+cq)+(a+b+cs)+2(4a+2b+ct)=0
  • (4a-2b+cp)+(a-b+cq)+(cr)+(a+b+cs)+(4a+2b+ct)=0

或者,简化,

  • 22a+10c = 4p+q+s+4t
  • 10b = -2p-q+s+2t
  • 10a+5c = p+q+r+s+t

所以 a,b,c = pq/2-rs/2+t, (2(tp)+(sq))/10, (p+q+r+s+t)/5-(2p-q-2r -s+2t)。

当然 c 是拟合多项式在 0 处的值,因此是我们想要的平滑值。所以对于每个空间位置,我们有一个输入光谱数据的向量,我们通过乘以一个矩阵来计算平滑的光谱数据,该矩阵的行(除了第一对和最后一对)看起来像 [0 ... 0 -9/ 5 4/5 11/5 4/5 -9/5 0 ... 0],中心 11/5 在矩阵的主对角线上。

所以你可以对每个空间位置进行矩阵乘法;但由于它在任何地方都是相同的矩阵,您只需调用tensordot. 因此,如果S包含我刚刚描述的矩阵(呃,等等,不,我刚刚描述的矩阵的转置)并且A是您的 3 维数据立方体,那么您的光谱平滑数据立方体将是numpy.tensordot(A,S).

这将是重复我的警告的好点:我没有检查上面几段中的任何细节,这只是为了说明它是如何工作的,以及为什么你可以在一个单一的线性代数运算。

于 2011-04-07T21:33:51.790 回答