[matplotlib animation] 108. フーリエ逆変換アニメーション

matplotlib

はじめに

matplotlibのFuncAnimationでフーリエ逆変換によって画像の低周波成分から高周波成分にかけて順次表示していくアニメーションを表示する方法について説明する。

コード&解説

モジュールのインポートなど

warningsを非表示にするために、warnings.filterwarnings(‘ignore’)とした。

バージョン

画像の読み込み

下記サイトの画像を用いる。

鏡餅のキャラクター
いらすとやは季節のイベント・動物・子供などのかわいいイラストが沢山見つかるフリー素材サイトです。

rgba2rgbでRGBA形式をRGBに変換し、rgb2grayでRGBをグレースケール画像にする。img_as_floatで値を0-1の範囲に収める。画像の形状と最大値の値は、それぞれ(704, 704), 0.99999994となる。

フーリエ変換

fftnとfftshiftでパワースペクトルが得られる。

画像とパワースペクトルを表示

読み込んだ画像とパワースペクトルを表示すると以下のようになる。
パワースペクトルは絶対値(np.abs)をとって、対数変換(np.log10)することで表示した。

マスク画像の作成

パワースペクトルをマスクするための画像を作成する。作成にはskimageのdisk_level_setを用いる。

最初にnp.logspace()で半径の配列を作成する。

作成した半径配列に対応するdisk_level_set画像を作成し、からのリストに加えていく。

なお、disk_level_setについては、下記記事で解説した。

[scikit-image] 101. レベルセット法の初期レベルセット(ディスク)を作成するための関数(skimage.segmentation.disk_level_set)
skimage.segmentation の disk_level_setでレベルセット法で行うセグメンテーションのためのディスク状の初期レベルセットを作成する方法について説明する。

disk_level_set画像の表示

作成したdisk_level_set画像の最初と最後の画像は以下のようになる。

フーリエ逆変換 ミニマスクの場合

フーリエ逆変換はifftshiftしてからifftnすることでできる。画像のコントラストを最適化するために、rescale_intensityをしている。表示すると以下のようになる。

フーリエ逆変換 ラージマスクの場合

中心のわずかしかないパワースペクトルをフーリエ逆変換すると以下のようになる。

フーリエ逆変換アニメーション

disk_level_setで作成した画像でマスクしたパワースペクトルをフーリエ逆変換して、リストに加えていく。

アニメーションはimshowの画像をset_dataで更新することで表示する。

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

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

参考

Fourier Transforms (scipy.fft) — SciPy v1.7.1 Manual
matplotlib.animation.FuncAnimation — Matplotlib 3.5.1 documentation

コメント