根据文档关于imageio.core.util.Array https://imageio.readthedocs.io/en/stable/devapi.html#imageio.core.Array, Array
是“一个子类np.ndarray
[...]”。因此,当调用resize
一些img
类型的Array
,实际调用转到np.ndarray.resize https://numpy.org/doc/stable/reference/generated/numpy.ndarray.resize.html- 哪个IS NOT np.resize https://numpy.org/doc/stable/reference/generated/numpy.resize.html!这在这里很重要。
从文档上np.ndarray.resize
:
Raises:
值错误
If 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
like
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
----------------------------------------