当将图像转换为numpy数组时如何调整其大小

9
考虑仅有.npy文件作为图像,是否可能调整图像大小而无需将其转换为图像(因为我正在寻找一种运行代码快速的方式)。 更多信息,请告诉我如何在不转换为图像的情况下进行操作。 我有图像,但我不想在代码中使用它们,因为我的数据集太大了,使用图像运行太慢,另一方面,我不确定哪个大小对我的图片更好,所以我正在寻找一种方法,首先将图像转换为npy并保存.npy文件,然后对npy文件进行预处理,例如调整图像的维度。

请查看scipy.misc.imresize - Matt Hall
我说过:"看看scipy.misc.imresize",但事实证明它已被弃用,推荐使用PIL。试试吧 - 或许它对你来说足够快。 - Matt Hall
1
调整大小基本上是一种图像处理过程 - 包括各种形式的采样、插值、平滑和/或平均。numpy本身并不实现大部分这些功能。 - hpaulj
2个回答

12

试试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


2
谢谢您的回答,但我想知道如何在不转换为图像的情况下进行操作。我认为Image.fromarray(arr)会将数组转换回图像,并且还是灰度图像。虽然我有图像,但我不想在代码中使用它们,因为我的数据集太大了,使用图像运行速度很慢。另一方面,我不确定哪种尺寸更适合我的图像。因此,我正在寻找一种方法,首先将图像转换为npy并保存.npy文件,然后预处理npy文件,例如调整图像的维度大小。我不知道这是否可能。我在问题上面添加了这个评论以便更好地解释。 - sha_hla
我没有测试第二种方法,现在我在网上看到它返回ndarray。我会尝试一下,希望能给我良好的性能。@kwinkunks - sha_hla

1
如果您只处理numpy数组,我认为切片就足够了。
比如说,加载的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]

这只能在一组狭窄的参数下工作,如果你想放大图像,它根本不起作用。 - Matt Hall
你说得对,我没有考虑到放大图像的问题。我刚把这一部分加入我的回答中,希望能有所帮助。 - meTchaikovsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接