Как я могу избавиться от артефактов сжатия в моей анимации matplotlib?

Я пытаюсь создать анимацию в matplotlib и вижу артефакты сжатия. статическое изображение демонстрирует плавный переход цветов, а анимация показывает артефакты сжатия. Как я могу сохранить анимацию без этих артефактов сжатия? Я взял некоторые параметры writer из этого ответа, но они не решили проблему.

Вы можете запустить код в этой записной книжке Google Colab или просмотреть ее. здесь:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation

images = np.array([
  np.tile(np.linspace(0, 1, 500), (50, 1)), 
  np.tile(np.linspace(1, 0, 500), (50, 1)), 
])
fps = 1

fig = plt.figure(frameon=False)
ax = plt.Axes(fig, [0., 0., 1., 1.])
fig.add_axes(ax)
artists = [[ax.imshow(image, animated=True, cmap='jet')] for image in images]
anim = animation.ArtistAnimation(fig, artists, interval=1000/fps, repeat_delay=1000)
writer = animation.PillowWriter(fps=fps, bitrate=500, codec="libx264", extra_args=['-pix_fmt', 'yuv420p'])
anim.save('./test_animation.gif', writer=writer)
ax.imshow(images[0], animated=True, cmap='jet');

Спасибо за любой совет!


person Mike    schedule 07.03.2021    source источник
comment
Вам нужно сохранить в формате mpeg вместо анимированного gif. Анимированный gif поддерживает только 256 различных цветов для всей анимации.   -  person JohanC    schedule 08.03.2021
comment
Спасибо, @JohanC. Я получаю KeyError, когда пытаюсь сохранить его как mpeg. Похоже, что использование FFMpegWriter вместо PillowWriter решает проблему (даже при сохранении в формате gif), но я не могу использовать FFMpegWriter в Google Colab.   -  person Mike    schedule 08.03.2021


Ответы (1)


Мне удалось найти решение, которое создает gif без артефактов и делает это в Colab (отчасти благодаря комментарию @JohanC).

Во-первых, мне нужно было сохранить анимацию с помощью FFMpeg как видео в формате mp4. Это создает видео высокого качества без артефактов сжатия.

writer = animation.FFMpegWriter(fps=fps)
anim.save('./test_animation.mp4', writer=writer)

Однако я хотел гифку, а не видео, и я хотел иметь возможность сделать это в Google Colab. Выполнение следующей команды преобразовало анимацию, избегая артефактов сжатия. (Некоторые из этих параметров взяты из этого ответа.

!ffmpeg -i test_animation.mp4 -vf "split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 test_animation.gif

Я обновил блокнот Google Colab.

person Mike    schedule 08.03.2021