当前位置: 首页 > 面试题库 >

重新采样表示图像的numpy数组

易淳
2023-03-14
问题内容

我正在寻找如何以新的大小重新采样表示图像数据的numpy数组,最好选择插值方法(最近,双线性等)。我知道有

scipy.misc.imresize

通过包装PIL的调整大小功能可以做到这一点。唯一的问题是,由于它使用PIL,因此numpy数组必须符合图像格式,最多可以提供4个“颜色”通道。

我希望能够使用任意数量的“彩色”通道来调整任意图像的大小。我想知道是否有简单的方法可以在scipy / numpy中执行此操作,或者是否需要自己滚动。

对于如何炮制自己,我有两个想法:

  • scipy.misc.imresize分别在每个通道上运行的功能
  • 创建自己的使用 scipy.ndimage.interpolation.affine_transform

对于大数据,第一个可能很慢,而第二个似乎没有提供除样条线以外的任何其他插值方法。


问题答案:

根据您的描述,您想要scipy.ndimage.zoom

双线性插值将为order=1,最接近为order=0,三次为默认值(order=3)。

zoom 专门用于要重新采样为新分辨率的常规栅格数据

作为一个简单的例子:

import numpy as np
import scipy.ndimage

x = np.arange(9).reshape(3,3)

print 'Original array:'
print x

print 'Resampled by a factor of 2 with nearest interpolation:'
print scipy.ndimage.zoom(x, 2, order=0)


print 'Resampled by a factor of 2 with bilinear interpolation:'
print scipy.ndimage.zoom(x, 2, order=1)


print 'Resampled by a factor of 2 with cubic interpolation:'
print scipy.ndimage.zoom(x, 2, order=3)

结果:

Original array:
[[0 1 2]
 [3 4 5]
 [6 7 8]]
Resampled by a factor of 2 with nearest interpolation:
[[0 0 1 1 2 2]
 [0 0 1 1 2 2]
 [3 3 4 4 5 5]
 [3 3 4 4 5 5]
 [6 6 7 7 8 8]
 [6 6 7 7 8 8]]
Resampled by a factor of 2 with bilinear interpolation:
[[0 0 1 1 2 2]
 [1 2 2 2 3 3]
 [2 3 3 4 4 4]
 [4 4 4 5 5 6]
 [5 5 6 6 6 7]
 [6 6 7 7 8 8]]
Resampled by a factor of 2 with cubic interpolation:
[[0 0 1 1 2 2]
 [1 1 1 2 2 3]
 [2 2 3 3 4 4]
 [4 4 5 5 6 6]
 [5 6 6 7 7 7]
 [6 6 7 7 8 8]]

编辑: 正如Matt
S.所指出的,放大多波段图像有两个注意事项。我正在从以前的答案之一中几乎逐字地复制下面的部分:

缩放也适用于3D(和nD)阵列。但是请注意,例如,如果放大2倍,则会沿 所有 轴缩放。

data = np.arange(27).reshape(3,3,3)
print 'Original:\n', data
print 'Zoomed by 2x gives an array of shape:', ndimage.zoom(data, 2).shape

这样产生:

Original:
[[[ 0  1  2]
  [ 3  4  5]
  [ 6  7  8]]

 [[ 9 10 11]
  [12 13 14]
  [15 16 17]]

 [[18 19 20]
  [21 22 23]
  [24 25 26]]]
Zoomed by 2x gives an array of shape: (6, 6, 6)

对于多波段图像,通常不希望沿“ z”轴进行插值,从而创建新波段。

如果您要缩放3波段RGB图像,可以通过指定一个元组序列作为缩放因子来实现:

print 'Zoomed by 2x along the last two axes:'
print ndimage.zoom(data, (1, 2, 2))

这样产生:

Zoomed by 2x along the last two axes:
[[[ 0  0  1  1  2  2]
  [ 1  1  1  2  2  3]
  [ 2  2  3  3  4  4]
  [ 4  4  5  5  6  6]
  [ 5  6  6  7  7  7]
  [ 6  6  7  7  8  8]]

 [[ 9  9 10 10 11 11]
  [10 10 10 11 11 12]
  [11 11 12 12 13 13]
  [13 13 14 14 15 15]
  [14 15 15 16 16 16]
  [15 15 16 16 17 17]]

 [[18 18 19 19 20 20]
  [19 19 19 20 20 21]
  [20 20 21 21 22 22]
  [22 22 23 23 24 24]
  [23 24 24 25 25 25]
  [24 24 25 25 26 26]]]


 类似资料:
  • 主要内容:降采样,升采样,频率转换,插值处理数据重采样是将时间序列从一个频率转换至另一个频率的过程,它主要有两种实现方式,分别是降采样和升采样,降采样指将高频率的数据转换为低频率,升采样则与其恰好相反,说明如下: 方法 说明 降采样 将高频率(间隔短)数据转换为低频率(间隔长)。 升采样 将低频率数据转换为高频率。 Pandas 提供了 resample() 函数来实现数据的重采样。 降采样 通过 resample() 函数完成数据的降采样

  • 问题内容: 我有一些层次结构数据,这些数据触底到达时间序列数据,看起来像这样: 我想对每个城市进行时间重采样,所以类似 将输出 就这样,让我 足够公平,但是我有点希望这能起作用: 在这一点上,我真的没什么主意了……是否有某种方法可以帮助我解决问题? 问题答案: 允许您指定“目标对象的groupby指令”。特别是,即使不是,您也可以使用它按日期分组: 在讲述寻找在多指标的最后一个级别的日期。此外,您

  • 我有一个小熊猫DataFrame我想重新取样,我希望你能帮我:) 我不能给你看,因为它是保密的,但我可以给你描述一个更简单的版本。 它有4列: -日期(YYYY-MM-DD格式) -国家 -数量 -频率 下面是我想做的: 根据行的不同,频率为每年或每月如果恰好是每月,则无需执行任何操作。 但如果是每年一次,我想将其改为每月一次,并插入11个新行,以便在考虑的12行(现有行和11个新行)中,国家将保

  • 创建一个有很多高质量图像的应用程序,我决定将图像缩小到所需的大小(这意味着如果图像比屏幕大,我会缩小它)。 我注意到,在一些设备上,如果图像被缩小,它们会变得模糊/像素化,但是在相同的设备上,对于相同的目标图像视图大小,如果图像没有缩小,它们看起来很好。 我决定进一步检查这个问题,并创建了一个小的POC应用程序来显示这个问题。 在向您展示代码之前,下面是我所说内容的演示: 很难看出区别,但是你可以

  • 问题内容: 以下PHP代码段使用GD将浏览器上传的PNG调整为128x128。效果很好,只是在我的情况下,原始图像中的透明区域已被替换为纯黑色。 即使已设置,也不是很正确。 在重新采样的图像中保留透明度的最佳方法是什么? 问题答案: 为我做了。谢谢ceejayoz。 请注意,目标图像需要Alpha设置,而不是源图像。 编辑:完整的替换代码。另请参见下面的答案及其评论。不能保证这是完美的,但确实满足

  • 我想在python中重塑一个数组(首先是numpy数组),使第一个索引处的每个元素都成为该数组中的一个正方形/象限,而不是常规的将所有元素都包含在一行中的重塑。 作为一个例子,我创建了这个数组,您可以将其解释为一个图像。我给它添加了一些值,这样我们就可以清楚地看到每个元素属于哪一行、哪列和哪条通道: 打印此数组显示: 所以,很明显,第一个索引被分组为图像行(在每个较大的组中,第一个数字是常数) 第