Python 在我的示例中,如何用枕头替换scipy.misc.imresize?

Python 在我的示例中,如何用枕头替换scipy.misc.imresize?,python,scipy,python-imaging-library,Python,Scipy,Python Imaging Library,我读了一些关于早期版本中被删除的scipy.misc.imresize,以及如何使用枕头的帖子。下面是产生错误的代码行 image_gray_resized = scipy.misc.imresize(arr=image_gray, size=fraction, interp='bicubic') 在我看到的示例中,这个语句的枕头版本只使用了两个参数,而我的使用了三个参数。我不知道我必须如何改变它,使其在枕头中工作,因为我不知道参数是如何变化的 scipy.misc.imresize(*arg

我读了一些关于早期版本中被删除的
scipy.misc.imresize
,以及如何使用枕头的帖子。下面是产生错误的代码行

image_gray_resized = scipy.misc.imresize(arr=image_gray, size=fraction, interp='bicubic')
在我看到的示例中,这个语句的枕头版本只使用了两个参数,而我的使用了三个参数。我不知道我必须如何改变它,使其在枕头中工作,因为我不知道参数是如何变化的

scipy.misc.imresize(*args, **kwds)
枕头版呢

numpy.array(Image.fromarray(arr).resize())

它们是相关的。更重要的是,我自己的3参数
imresize
如何适应这一点。

让我们检查一下旧的文档页面:

  • arr
    是图像本身作为一个NumPy数组
  • 大小
    可以
    • 一个
      int
      (表示某个百分比)
    • 一个
      浮点数
      (表示某个分数,这是你的例子),或者
    • 元组(指示目标大小)
  • interp
    是要使用的插值方法
现在,让我们检查一下,什么能够:

  • 大小
    必须是
    元组
    。因此,在使用上述百分比或分数时,需要事先确定目标大小
  • resample
    是重采样过滤器,它基本上是上面给出的插值方法
这就是我们导出正确代码所需的全部知识:

从imageio导入imread#scipy.misc.imread不推荐使用
将numpy作为np导入
从PIL导入图像#scipy.misc.imresize不推荐使用
#读取图像,获取宽度和高度
img=imread('path/to/your/image.png')
h、 w=图像形状[:2]
打印(图像形状)
# (241, 300, 3)
#分数作为浮点数
分数=0.2
img_resized=np.array(Image.fromarray(img).resize((int(分数*w))),
int(分数*h)),
图像(双三次)
打印(img_已调整大小。形状)
# (48, 60, 3)
#整数百分比
百分比=20
img_resized=np.array(Image.fromarray(img).resize((int(百分比/100*w)),
int(百分比/100*h)),
图像(双三次)
打印(img_已调整大小。形状)
# (48, 60, 3)
#大小为元组
大小=(60,48)
img_resized=np.array(Image.fromarray(img).resize(size,Image.BICUBIC))
打印(img_已调整大小。形状)
# (48, 60, 3)
该示例显示了如何处理三种不同的缩放方式(百分比、分数、目标大小)。对于不同的插值方法,您只需要从
最近的
映射到
PIL.Image.nearest
,依此类推


编辑:仅作进一步说明:将输入NumPy数组转换为枕头对象,这样您就可以使用
PIL.Image.resize

----------------------------------------
系统信息
----------------------------------------
平台:Windows-10-10.0.16299-SP0
Python:3.9.1
PyCharm:2021.1.1
图像IO:2.9.0
NumPy:1.20.2
枕头:8.2.0
----------------------------------------

HansHirse有一个疑问。在最后一种方法中,您将其调整为元组大小,语句大小(60,48)是使图像为60像素乘以48像素,还是其他什么?此外,如果我使用imageio读取图像,但没有获得其原始尺寸(如W和H),它会工作吗?枕头使用
(宽度、高度)
元组,而-由于NumPy数组的(默认)行主要顺序-
形状
返回
(高度、宽度、通道)
。因此,所有三种呈现方式都使用
(60,48)
(宽度,高度)
生成相同的图像。使用百分比或分数调整大小时,必须计算目标大小。因此,您需要原始维度。要么在NumPy数组上使用
shape
,要么在
Image
对象上使用and
height
。我明白了,这就是原因。