如何使用imageio调整图像大小?

考虑img类型为 的图像imageio.core.util.Array

的形状img(256, 256, 3)。我想将其调整为(128, 128, 3).

我至少尝试了以下三个:

img.resize(img_res, pilmode="RGB")
img.resize(img_res)
img = cv2.resize(img, self.img_res)

在这里img_res = (128, 128)

他们没有一个工作得很好。如何将我的图像调整到所需的大小?

回答

根据关于 的文档imageio.core.util.ArrayArray是“ np.ndarray[...]的子类”。因此,当调用resize某些imgtype 时Array,实际调用会转到np.ndarray.resize- 这不是 np.resize!这在这里很重要。

从文档中np.ndarray.resize

提高:

值错误

如果a不拥有自己的数据 [...]

这就是为什么,一些代码像

import imageio

img = imageio.imread('path/to/your/image.png')
img.resize((128, 128))

会以这种方式失败:

Traceback (most recent call last):
    img.resize((128, 128))
ValueError: cannot resize this array: it does not own its data

该错误似乎与Array类有关,因为以下代码也失败并显示相同的错误消息:

from imageio.core.util import Array
import numpy as np

img = Array(np.zeros((200, 200, 3), np.uint8))
img.resize((128, 128))

显然,这个Array类只存储了一些不能直接访问的 NumPy 数组的视图,也许是一些内部内存缓冲区!?

现在,让我们看看可能的解决方法:

实际上,使用np.resize

import imageio
import numpy as np

img = imageio.imread('path/to/your/image.png')
img = np.resize(img, (128, 128, 3))

不是一个好的选择,因为np.resize它不是为正确调整图像大小而设计的。所以,结果是扭曲的。

使用 OpenCV 对我来说很好用:

import cv2
import imageio

img = imageio.imread('path/to/your/image.png')
img = cv2.resize(img, (128, 128))

请记住,OpenCV 使用 BGR 排序,而 imageio 使用 RGB 排序——这在cv2.imshow例如也使用时很重要。

使用 Pillow 也没有问题:

import imageio
from PIL import Image

img = imageio.imread('path/to/your/image.png')
img = Image.fromarray(img).resize((128, 128))

最后,还有skimage.transform.resize

import imageio
from skimage.transform import resize

img = imageio.imread('path/tp/your/image.png')
img = resize(img, (128, 128))

选择最适合您需求的一款!

----------------------------------------
System information
----------------------------------------
Platform:      Windows-10-10.0.16299-SP0
Python:        3.8.5
imageio:       2.9.0
NumPy:         1.19.5
OpenCV:        4.5.1
Pillow:        8.1.0
scikit-image:  0.18.1
----------------------------------------


以上是如何使用imageio调整图像大小?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>