3

我正在尝试使用 imageio 创建 GIF。这相当简单;但是,图像质量很差。它们似乎是内插的。见下图。

我正在使用下面显示的代码创建 GIF。我已经尝试跟踪源代码中图像的生成方式,问题似乎来自 PIL。

from PIL import Image
import imageio
import numpy as np
import matplotlib.pyplot as plt

outdir = r"where/you/want/it/to/go.gif"
frames = np.round(100+20*np.random.randn(10, 40, 40)).astype(np.uint8)

# Create single gif frame with PIL
im = Image.fromarray(frames[0])
im.save(outdir)

# Create gif with imageio
imageio.mimsave(outdir, frames)

我想要一个看起来像我用matplotlib. 底部的图像是使用imageio.

使用 matplotlib 显示的图像,插值设置为

图片由 PIL 制作。 注意似乎是空间插值

4

1 回答 1

0

我试图重现这个问题,但是 - 据我所知 - ImageIO 或 Pillow 内部都没有发生插值:

from PIL import Image
import imageio as iio
import numpy as np
import io

for _ in range(100):
    expected_frames = np.round(100+20*np.random.randn(10, 40, 40)).astype(np.uint8)

    # test writing with pillow
    pil_buffer = io.BytesIO()
    im = Image.fromarray(expected_frames[0])
    gif_bytes = im.save(pil_buffer, format="GIF")
    actual_pil = iio.v3.imread(pil_buffer, mode="L")
    assert np.all(actual_pil == expected_frames[0])

    # test writing with ImageIO
    gif_bytes = iio.v3.imwrite("<bytes>", expected_frames, format="GIF") 
    actual_iio = iio.v3.imread(gif_bytes, index=None, mode="L")
    assert np.all(actual_iio == expected_frames)

print("No roundtrip modified any pixels.")

所以我认为要么

  • Pillow 或 ImageIO 中可能存在已修复的错误(已修复 3 年)
  • 您用于显示第二张图像的工具/应用程序会在您放大图像时进行插值(因为该图像是 200x200 像素而不是 40x40 像素)
于 2022-02-10T04:33:25.720 回答