Loading [MathJax]/jax/output/HTML-CSS/config.js

[matplotlib animation] 27. スノーノイズ

matplotlib Animation

はじめに

matplotlib FuncAnimationでスノーノイズのアニメーションを作成する。

コード

%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from IPython.display import HTML
fig, ax = plt.subplots()
plt.tick_params(labelbottom=False, labelleft=False)
plt.tick_params(color='white')
def update(num):
ax.cla()
snow_n = plt.imshow(data[:,:,num], cmap='binary', vmin=0, vmax=1)
data = np.random.randint(0,2,(240,320,10)) # 4:3 ブラウン管TV
ani = animation.FuncAnimation(fig, update, 10, interval=100)
HTML(ani.to_html5_video())
#dpi=100
#ani.save('snownoise.mp4', writer="ffmpeg",dpi=dpi)
view raw snow_noise.py hosted with ❤ by GitHub

解説

モジュールのインポート

%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from IPython.display import HTML
view raw snow_noise.py hosted with ❤ by GitHub

図と軸と軸ラベルの設定

fig, ax = plt.subplots()
plt.tick_params(labelbottom=False, labelleft=False)
plt.tick_params(color='white')
view raw snow_noise.py hosted with ❤ by GitHub

軸のラベルを非表示にし、軸の目盛を白くして見えないようにしている。

スノーノイズデータの生成

data = np.random.randint(0,2,(240,320,10)) # 4:3 ブラウン管TV
view raw snow_noise.py hosted with ❤ by GitHub

スノーノイズとは、ブラウン管TVでアナログテレビ放送を受信する際に生じるノイズのことである。

np.random.randint(0,2,(240,320,10)) で0または1のランダムなデータ群を生成する。データの構造は、(240,320)のデータが10個ある構造となっている。
データのサイズについては、ブラウン管TVのアスペクト比とおなじになるように4:3とした。

アニメーションの設定

def update(num):
ax.cla()
snow_n = plt.imshow(data[:,:,num], cmap='binary', vmin=0, vmax=1)
view raw snow_noise.py hosted with ❤ by GitHub

アニメーションでは古い画像を消して新しい画像を表示するという動作を繰り返すので、ax.cla()で現在表示されている画像を消している。

plt.imshow(data[:,:,num], cmap=’binary’, vmin=0, vmax=1)で白黒のスノーノイズ画像をnumに従って、順次表示していく。つまり、表示されるdataは、data[:,:,0]、data[:,:,1]、data[:,:,2]という風になる。

アニメーションの表示

ani = animation.FuncAnimation(fig, update, 10, interval=100)
HTML(ani.to_html5_video())
view raw snow_noise.py hosted with ❤ by GitHub

FuncAnimationでanimationの表示。updateを10step実行してアニメーションとする。intervalは100 ms なので1秒のアニメーションとなる。
HTML(ani.to_html5_video())でjupyter notebook上にアニメーションを表示できる。

アニメーションの保存

#dpi=100
#ani.save('snownoise.mp4', writer="ffmpeg",dpi=dpi)
view raw snow_noise.py hosted with ❤ by GitHub

ani.save(‘snownoise.mp4’, writer=”ffmpeg”,dpi=dpi)でアニメーションを保存することができる。dpiを設定することで指定の解像度での保存が可能。

ffmpegのインストールが必要な場合は、

conda install -c anaconda ffmpeg 

によりインストールする。(condaでモジュールの管理をしている場合)

コードをダウンロード(.pyファイル)

コードをダウンロード(.ipynbファイル)

参考

スノーノイズ - Wikipedia
pyplot animation — Matplotlib 3.10.1 documentation

コメント