【问题标题】:How to replace scipy.misc.imresize with Pillow in my example?在我的示例中,如何用 Pillow 替换 scipy.misc.imresize?
【发布时间】:2021-05-20 04:55:40
【问题描述】:

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

image_gray_resized = scipy.misc.imresize(arr=image_gray, size=fraction, interp='bicubic')

在我看到的示例中,此语句的 Pillow 版本仅使用两个参数,而我的使用三个参数。我不知道我必须如何更改它才能使其在 Pillow 中工作,因为我不知道其中的参数如何

scipy.misc.imresize(*args, **kwds)

还有枕头版

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

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

【问题讨论】:

    标签: python scipy python-imaging-library


    【解决方案1】:

    让我们查看scipy.misc.imresize 的旧文档页面:

    • arr 是图像本身作为 NumPy 数组。
    • size可以
      • int(表示某个百分比),
      • float(表示某个分数,这是您的示例),或者
      • tuple(表示目标大小)。
    • interp 是要使用的插值方法。

    现在,让我们检查一下PIL.Image.resize 的能力:

    • size 必须是 tuple。因此,在使用上述百分比或分数时,您需要事先确定目标大小。
    • resample是重采样滤波器,基本上就是上面给出的插值方法。

    这就是派生正确代码所需要知道的全部内容:

    from imageio import imread      # scipy.misc.imread is deprecated
    import numpy as np
    from PIL import Image           # scipy.misc.imresize is deprecated
    
    # Read image, get width and height
    img = imread('path/to/your/image.png')
    h, w = img.shape[:2]
    print(img.shape)
    # (241, 300, 3)
    
    # Fraction as float
    fraction = 0.2
    img_resized = np.array(Image.fromarray(img).resize((int(fraction * w),
                                                        int(fraction * h)),
                                                       Image.BICUBIC))
    print(img_resized.shape)
    # (48, 60, 3)
    
    # Percentage as integer
    percentage = 20
    img_resized = np.array(Image.fromarray(img).resize((int(percentage / 100 * w),
                                                        int(percentage / 100 * h)),
                                                       Image.BICUBIC))
    print(img_resized.shape)
    # (48, 60, 3)
    
    # Size as tuple
    size = (60, 48)
    img_resized = np.array(Image.fromarray(img).resize(size, Image.BICUBIC))
    print(img_resized.shape)
    # (48, 60, 3)
    

    该示例显示了如何处理三种不同的缩放方式(百分比、分数、目标大小)。对于不同的插值方法,您只需要从nearest 映射到PIL.Image.NEAREST,等等。


    编辑:只是为了进一步解释:PIL.Image.fromarray 将输入 NumPy 数组转换为 Pillow PIL.Image.Image 对象,这样您就可以使用 PIL.Image.resize

    ----------------------------------------
    System information
    ----------------------------------------
    Platform:      Windows-10-10.0.16299-SP0
    Python:        3.9.1
    PyCharm:       2021.1.1
    imageio:       2.9.0
    NumPy:         1.20.2
    Pillow:        8.2.0
    ----------------------------------------
    

    【讨论】:

    • 一个疑问@HansHirse。在最后一种方法中,您将其调整为元组的大小,语句 size(60,48) 是使图像成为 60 像素 x 48 像素还是其他什么?另外,如果我使用 imageio 读取图像并且没有获得 W 和 H 的原始尺寸,它会起作用吗?
    • Pillow 使用 (width, height) 元组,而 - 由于 NumPy 数组的(默认)行优先排序 - shape 返回 (height, width, channels)。因此,所有三种呈现方式都使用(60, 48)(width, height) 生成相同的图像。使用百分比或分数调整大小时,您必须计算目标大小。因此,您不知何故需要原始尺寸。要么在 NumPy 数组上使用 shape,要么在 Image 对象上使用 widthheight
    • 原来如此。
    猜你喜欢
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多