【问题标题】:How resize images when those converted to numpy array将图像转换为 numpy 数组时如何调整图像大小
【发布时间】:2025-06-06 12:05:02
【问题描述】:

假设我们只有图像 as.npy 文件。是否可以在不将其转换为图像的情况下调整图像大小(因为我正在寻找一种在运行代码时快速的方法)。 有关更多信息,我问了没有转换为图像的方式,我有图像,但我不想在代码中使用它们,因为我的数据集太大并且使用图像运行很慢,另一方面,我不确定哪个size 对我的 imeges 来说更好,所以我正在寻找一种方法,首先将图像转换为 npy 并保存 .npy 文件,然后预处理 npy 文件,例如调整图像的尺寸。

【问题讨论】:

  • 我说“查看scipy.misc.imresize”,但事实证明它已被PIL 弃用。试一试 - 也许它对你来说已经足够快了。
  • 调整大小基本上是一个图像过程 - 涉及各种形式的采样、插值、平滑和/或平均。 numpy 本身并没有实现大部分功能。

标签: python numpy image-processing data-science numpy-ndarray


【解决方案1】:

试试PIL,也许它对你来说已经足够快了。

import numpy as np
from PIL import Image

arr = np.load('img.npy')
img = Image.fromarray(arr)
img.resize(size=(100, 100))

请注意,如果要保留纵横比,则必须计算纵横比。或者你可以使用Image.thumbnail(),它可以带一个抗锯齿过滤器。

还有scikit-image,但我怀疑它在后台使用PIL。它适用于 NumPy 数组:

import skimage.transform as st

st.resize(arr, (100, 100))

我猜另一个选项是OpenCV

【讨论】:

  • 感谢您的回答,但我问了没有转换为图像的方式,我认为Image.fromarray(arr) 将数组转换回图像并且也是灰度的,我有图像但我不想在代码中使用它们,因为我的数据集太大并且使用图像运行很慢,另一方面,我不确定哪种尺寸更适合我的 imeges,所以我正在寻找一种方法,首先将图像转换为 npy 并保存 .npy 文件然后预处理 npy 文件,例如调整图像的尺寸。我不知道这可能与否。我在我的问题中添加了这条评论,以便更多地解释其他人。
  • 我没有检查第二种方式,现在我在网络中看到返回 ndarray。我会试试的,希望能给我带来好的表现。 @kwinkunks
【解决方案2】:

如果你只处理numpy 数组,我认为slicing 就足够了

比如说,加载的numpy数组的形状是(m, n)(一个通道),目标形状是(a, b)。那么步幅可以是(s1, s2) = (m // a, n // b)

所以原来的数组可以被切片

new_array = old_array[::s1, ::s2]

编辑

如果您使用掩码进行高级切片,则放大数组也非常简单。例如,原始数组的形状为(m, n),目标形状为(a, b)。那么,举个例子

a, b = 300, 200
m, n = 3, 4

original = np.linspace(1, 12, 12).reshape(3, 4)
canvas = np.zeros((a, b))
(s1, s2) = (a // m, b // n) # the scalar

# the two masks  
mask_x = np.concatenate([np.ones(s1) * ind for ind in range(m)])
mask_y = np.concatenate([np.ones(s2) * ind for ind in range(n)])

# make sure the residuals are taken into account
if len(mask_x) < a: mask_x = np.concatenate([mask_x, np.ones(len(mask_x) % a) * (m - 1)])
if len(mask_y) < b: mask_y = np.concatenate([mask_y, np.ones(len(mask_y) % b) * (n - 1)])
mask_x = mask_x.astype(np.int8).tolist()
mask_y = mask_y.astype(np.int8).tolist()

canvas = original[mask_x, :]
canvas = canvas[:, mask_y]

【讨论】:

  • 这仅适用于一组狭窄的参数,如果您想放大图像,则根本不起作用。
  • 你说得对,我没有考虑放大图像,我只是将这部分包含在我的答案中,希望对您有所帮助。