【问题标题】:Resample numpy array with interpolation使用插值重新采样 numpy 数组
【发布时间】:2020-05-22 10:47:36
【问题描述】:

我正在 Python 中处理 5 个已导入为 numpy 数组并具有以下形状的图像:

for i in range(len(S_images)):
    print(S_images[i].shape)

(1, 1524, 5500)
(1, 1524, 5499)
(1, 1524, 5500)
(1, 1524, 5499)
(1, 1525, 5499)

我的目标是使用S_stack = np.stack(S_images) 将它们堆叠在一起,但当然,由于形状不同,我得到了错误:

ValueError: all input arrays must have the same shape

我想要将数组重新采样为一个常见的形状(例如,(1, 1524, 5500)),同时选择一种重新采样方法,例如最近邻。

在论坛找previosu Q&A 看到有scipy.ndimage.zoom的使用,不过这个一般是升级或降级常规数据。就我而言,我只需要匹配的形状以允许堆栈。有什么建议吗?

是否有可能例如选择一个主阵列并将其用作所有其他阵列必须与其形状匹配的参考,如果没有,将应用使用 NN 的重采样方法?

【问题讨论】:

  • 如果是图片,您是否考虑过以下任何一种方法:裁剪、缩放、固定比例拉伸和裁剪。
  • 感谢您的评论。裁剪可以解决这个问题,但从技术上讲它是不正确的,因为图像覆盖了相同的区域(卫星图像)。拉伸和重新缩放不是与应用插值来获得新形状类似的方法吗?
  • @MateenUlhaq 我已经为我的问题添加了答案。如果您有经验,您认为在我的情况下它是一个有效的选择吗?
  • 可能有更强大的方法来做到这一点。 (您的浮点值可能有错误并生成错误大小的图像。)
  • 如果只有一个,例如。列我会考虑简单地填充np.pad

标签: python arrays numpy interpolation resampling


【解决方案1】:

我想出了一个解决方案,但我想知道从技术/科学的角度来看它是否正确。这是解决我的问题的好程序吗?实际上,它正在做我想做的事......

for i in range(len(S_images)):
    if S_images[i].shape[1] !=1524:
        S_images[i] = scipy.ndimage.zoom(S_images[i], (1, 1524/1525, 1),order=0, mode='nearest')

for i in range(len(S_images)):
    if S_images[i].shape[2] !=5499:
        S_images[i] = scipy.ndimage.zoom(S_images[i], (1, 1, 5499/5500 ),order=0, mode='nearest')


for i in range(len(S_images)):
    print(S_images[i].shape)

(1, 1524, 5499)
(1, 1524, 5499)
(1, 1524, 5499)
(1, 1524, 5499)
(1, 1524, 5499)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-19
    • 2017-06-12
    • 2013-11-11
    • 2012-10-25
    • 2014-10-04
    • 1970-01-01
    • 2014-06-18
    • 2019-10-20
    相关资源
    最近更新 更多