見出し画像

SimulinkでGIFアニメ保存~サッチャー錯視~ゆっくりシミュレーション?

静止画からアニメーションGIFを作る

MATLAB(Simulink)でアニメーションGIF でも一度解説したのですが、アニメーションplotと合わせてちょっと複雑だったので、今回は単純に、静止画像を元にアニメーションGIF化する方法を。

例として、一枚の静止画像を15°ずつ回転させるGIFを作ってみましょう。回転させる部分には、Computer Vision Toolbox が必要です。

画像6

右クリック -> モデルコンフィギュレーションパラメータ -> ソルバーの選択 は、「固定ステップ」、「離散」とします。

画像9

今回はゆっくり回したいので、サンプル時間は1sとします。1s単位でシミュレーションが進みます。

画像4

画像は、Rotate処理の都合上、double型で読み込みます。

画像2

Rotateの設定は以下のようにします。

画像5

saveGIF(MATLAB Functionブロック)の中身は以下の通りです。

function saveGIF(u,t,WE)
persistent filename  we  % 永続変数として保持

% コード生成に対応していない関数を外部関数として定義
coder.extrinsic('imwrite', 'rgb2ind')

if isempty(filename)  % 初回設定
   we = WE;
   filename = 'Thatcher.gif';
   [A,map] = rgb2ind(u,256);  % 書き込み用インデックスイメージに変換
   if we; imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',3); end  % pause 3s
else  % 初回以外
   [A,map] = rgb2ind(u,256);
   if we
       if t == 12; dt = 3; else; dt = 1/2; end  % 2frame/s -> pause 3s -> 2frame/s
       imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',dt);
   end
end

1フレーム目と180°回転したところ(1s毎に15°回転させているので12s目)は3s、それ以外は0.5sずつ表示し、360°回って最初に戻るようにしています。

ゆっくりシミュレーション

Simulinkでは実は、実行速度を遅くすることもできます。

シミュレーションタブ -> 実行 -> シミュレーションペーシング で、出力するGIFのフレームレートに合わせ、2とします。こうすると、書き出すGIFと同じ速度で確認することができます。

画像6

サッチャー錯視

さて、今回読み込んでいる静止画はこれ。上下逆さまの画像です。

画像7

何かおかしいことにお気づきでしょうか?

大元はこちら。

画像8

しばらく見比べてみてください。

・・・

・・・

・・・

・・・

・・・

一枚目の画像を180°回転して上下を戻してみましょう。

・・・

・・・

・・・

・・・

・・・

画像9

そう、目が上下逆だったのです!

こんなに不自然なのに、上下逆の状態で見ると、それほど不自然に見えなかったのではないでしょうか?

これは人間の顔で特に起こりやすい錯視で、イギリスのサッチャー元首相の顔を使った例で有名になったことから、「サッチャー錯視」と呼ばれています。人間は人の顔をパーツ単位で認識しているため、このような現象が起こると言われています。

本当は口も反転させるんですが、この写真の場合はそれだと上下逆にしてもあきらかに不自然なのでやめておきました。(^_^;)

アニメーションGIF

それでは最後に、出力されたアニメーションGIFを見てみましょう。

画像10

もちろん、回転させているだけです。MATLABは嘘をつきません。

ほんと人間の認識って、適当なのか繊細なのかよく分からないですね。(u_u)

この記事が参加している募集

つくってみた

やってみた

この記事が気に入ったらサポートをしてみませんか?