缩小时的值插值

2024-09-30 03:22:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个二维数组,我想向下采样,以比较它与另一个。在

假设我的数组x512x512,我想要一个数组y128x128,其中{}的元素是使用4x4上的x块上的值的插值来构建的(这种插值可以取平均值,但是其他方法,比如几何平均值,可能会很有趣)

到目前为止,我查看了scipy.ndimage.interpolation.zoom,但没有得到我想要的结果

>> x = np.arange(16).reshape(4,4)
>> print(x)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
>> y = scipy.ndimage.interpolation.zoom(x, 0.5)
>> print(y)
[[ 0  3]
 [12 15]]

我希望y

^{pr2}$

注意,仅仅设置dtype=np.float32并不能解决这个问题。。。在


Tags: 方法元素npscipy数组平均值插值print
2条回答

sklearn.feature_extraction.image.extract_patches巧妙地使用np.lib.stride_tricks.as_strided生成一个可操作的窗口数组。在

sliding_window函数,可在此处找到 Efficient Overlapping Windows with Numpy,生成有或无重叠的窗口数组 同时,让我们来看看引擎盖下发生了什么。在

>>> a = np.arange(16).reshape(4,4)

step_height,step_width确定窗口的重叠-在您的例子中,步骤与窗口大小相同,没有重叠。在

^{pr2}$

在车窗上操作:

>>> y = y.mean(axis = (1,2))
>>> y
array([  2.5,   4.5,  10.5,  12.5])

你需要根据窗户的数量来决定最终的形状。在

>>> final_shape = (2,2)
>>> y = y.reshape(final_shape)
>>> y
array([[  2.5,   4.5],
       [ 10.5,  12.5]])

搜索numpy,window,array应该会产生许多其他答案和可能的解决方案。在

您似乎在寻找的是4的块上的平均值,这是不能用zoom获得的,因为zoom使用了插值(参见其docstring)

要获得您显示的内容,请尝试以下操作

import numpy as np
x = np.arange(16).reshape(4, 4)

xx = x.reshape(len(x) // 2, 2, x.shape[1] // 2, 2).transpose(0, 2, 1, 3).reshape(len(x) // 2, x.shape[1] // 2, -1).mean(-1)

print xx

这就产生了

^{pr2}$

或者,可以使用sklearn.feature_extraction.image.extract_patches来完成此操作

from sklearn.feature_extraction.image import extract_patches

patches = extract_patches(x, patch_shape=(2, 2), extraction_step=(2, 2))

xx = patches.mean(-1).mean(-1)

print xx

但是,如果您的目标是以一种优雅的方式对图像进行子采样,那么对图像的块取平均值是而不是正确的方法:它很可能会导致锯齿效应。在这种情况下,您应该做的是使用scipy.ndimage.gaussian_filter(例如sigma=0.35 * subsample_factor)稍微平滑图像,然后简单地通过索引[::2, ::2]对图像进行子采样

相关问题 更多 >

    热门问题