考虑仅有.npy文件作为图像,是否可能调整图像大小而无需将其转换为图像(因为我正在寻找一种运行代码快速的方式)。
更多信息,请告诉我如何在不转换为图像的情况下进行操作。 我有图像,但我不想在代码中使用它们,因为我的数据集太大了,使用图像运行太慢,另一方面,我不确定哪个大小对我的图片更好,所以我正在寻找一种方法,首先将图像转换为npy并保存.npy文件,然后对npy文件进行预处理,例如调整图像的维度。
试试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)
会将数组转换回图像,并且还是灰度图像。虽然我有图像,但我不想在代码中使用它们,因为我的数据集太大了,使用图像运行速度很慢。另一方面,我不确定哪种尺寸更适合我的图像。因此,我正在寻找一种方法,首先将图像转换为npy并保存.npy文件,然后预处理npy文件,例如调整图像的维度大小。我不知道这是否可能。我在问题上面添加了这个评论以便更好地解释。 - sha_hlanumpy
数组,我认为切片
就足够了。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]
scipy.misc.imresize
。 - Matt Hallscipy.misc.imresize
",但事实证明它已被弃用,推荐使用PIL
。试试吧 - 或许它对你来说足够快。 - Matt Hallnumpy
本身并不实现大部分这些功能。 - hpaulj