scipy.misc 图像函数上的 AttributeError、ImportError(例如 imread、imresize、imsave、imshow 等)

pgm*_*ank 3 image scipy python-import importerror

在尝试导入或直接使用scipy.misc模块中包含的任何图像函数时,我遇到了两种错误。以下是该imread()函数的两个错误示例:

>>> from scipy.misc import imread

ImportError: cannot import name 'imread' from 'scipy.misc'
Run Code Online (Sandbox Code Playgroud)

和

>>> import scipy.misc                                                                                                                                                                
>>> scipy.misc.imread

AttributeError: module 'scipy.misc' has no attribute 'imread'
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

pgm*_*ank 8

你没有做错任何事。这是由于从scipy.miscSciPy 版本 1.2.0 开始从模块中删除了图像函数。我不知道为什么他们认为这些功能已弃用并删除了它们,但是如果您想使用它们,您可以通过卸载当前版本并安装以前的版本来回滚到以前的 SciPy 版本:

pip uninstall scipy
pip install scipy==1.1.0
Run Code Online (Sandbox Code Playgroud)

确保你也Pillow安装了:

pip install Pillow
Run Code Online (Sandbox Code Playgroud)

如果您不想使用旧版本的 SciPy,则需要更改代码。根据每个已弃用函数的官方文档,以下是 SciPy 的建议:

  • fromimage(im) -> np.asarray(im)
  • imfilter() -> 直接使用枕头过滤功能。
  • imread() -> imageio.imread()
  • imsave() -> imageio.imwrite()
  • imresize() -> numpy.array(Image.fromarray(arr).resize())
  • imrotate -> skimage.transform.rotate()
  • imshow() -> matplotlib.pyplot.imshow()
  • toimage() -> Image.fromarray()

它假设安装以下库:

pip install numpy Pillow scikit-image imageio matplotlib
Run Code Online (Sandbox Code Playgroud)

并导入它们:

import numpy as np, Pillow, skimage, imageio, matplotlib
Run Code Online (Sandbox Code Playgroud)

此外,我引用了我发现的两个来源,提到了scipy.misc图像 I/O 功能的弃用:

来自scipy.github.io:

下面的功能scipy.misc已被弃用:bytescale,fromimage,imfilter,imread,imresize,imrotate,imsave,imshow和toimage。这些函数中的大多数都有意想不到的行为(比如在没有用户要求的情况下重新缩放和类型转换图像数据)。其他功能只是有更好的选择。

来自imageio.readthedocs.io(特别是对于imread):

从 Scipy 的 imread 过渡

Scipy 正在弃用他们的图像 I/O 功能。

本文档旨在帮助来自 Scipy 的人适应 Imageio 的 imread 功能。我们建议阅读用户 api 并查看一些示例以了解 imageio。

Imageio 利用各种插件来支持从许多不同格式读取图像(和卷/电影)。幸运的是,Pillow 是常见图像的主要插件,它与 Scipy 的 imread 使用的库相同。请注意,Imageio 会根据要读取的图像自动选择插件(除非明确指定格式),但在可能的情况下使用 Pillow。

简而言之:对于之前通过Scipy的imread读取的图片,imageio一般也应该使用Pillow,在这些情况下imageio提供和Scipy一样的功能。但请记住:

  • 使用 pilmode 关键字参数代替 mode。
  • 使用 as_gray 关键字参数代替 flatten。
  • 上述参数的文档不在 imread 上,而是在各个格式的文档上,例如 PNG。
  • Imageio 的函数都返回 numpy 数组,尽管是作为子类(以便可以附加元数据)。