gpt4 book ai didi

Python:通过非整数因子对 2D numpy 数组进行下采样

转载 作者:太空狗 更新时间:2023-10-30 00:16:53 29 4
gpt4 key购买 nike

我需要通过非整数因子(例如 100x100 阵列到 45x45 阵列)以执行局部平均的方式对 2D numpy 阵列进行下采样,就像 Photoshop/gimp 对图像所做的那样。我需要 double 。当前的选择不能很好地做到这一点。

  • scipy.ndimage.zoom 不做平均,基本用最近邻采样(参见上一个问题 scipy.ndimage.interpolation.zoom uses nearest-neighbor-like algorithm for scaling-down)

  • scipy.misc.imresize 将数组转换为 int8;我需要更多精度和 float

  • skimage.transform.rescale 也使用最近邻并将您转发到 skimage.transform.downscale_local_mean 进行局部平均,

  • skimage.transform.downscale_local_mean 只能执行整数缩放因子(如果因子是非整数,则用零填充图像)。整数比例因子是一个微不足道的 numpy 练习。

我是否错过了任何其他选项?

最佳答案

我最终编写了一个使用 scipy.ndimage.zoom 放大图像的小函数,但为了缩小它,首先将其放大为原始形状的倍数,然后按 block 缩小 -平均。它接受 scipy.zoom 的任何其他关键字参数(orderprefilter)

我仍在寻找使用可用包的更清洁的解决方案。

def zoomArray(inArray, finalShape, sameSum=False, **zoomKwargs):
inArray = np.asarray(inArray, dtype = np.double)
inShape = inArray.shape
assert len(inShape) == len(finalShape)
mults = []
for i in range(len(inShape)):
if finalShape[i] < inShape[i]:
mults.append(int(np.ceil(inShape[i]/finalShape[i])))
else:
mults.append(1)
tempShape = tuple([i * j for i,j in zip(finalShape, mults)])

zoomMultipliers = np.array(tempShape) / np.array(inShape) + 0.0000001
rescaled = zoom(inArray, zoomMultipliers, **zoomKwargs)

for ind, mult in enumerate(mults):
if mult != 1:
sh = list(rescaled.shape)
assert sh[ind] % mult == 0
newshape = sh[:ind] + [sh[ind] / mult, mult] + sh[ind+1:]
rescaled.shape = newshape
rescaled = np.mean(rescaled, axis = ind+1)
assert rescaled.shape == finalShape

if sameSum:
extraSize = np.prod(finalShape) / np.prod(inShape)
rescaled /= extraSize
return rescaled

关于Python:通过非整数因子对 2D numpy 数组进行下采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34122012/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com