2023/05/25(木) [n年前の日記]
#1 [gimp] GIMPでモーフィングをしてみる手順をメモ
無料で利用できる画像編集ソフト GIMP を使って、モーフィング処理ができそうかどうか試してみたので、作業手順をメモ。
モーフィングと言うのは、2枚の異なる画像から、その中間の画像を生成する処理、という説明でいいのだろうか…?
_モーフィング - Wikipedia
GIMPの標準機能だけではモーフィングはできないけれど、以下の組み合わせならモーフィングが使える。
とりあえず今回は、GIMP 2.10.34 Portable + G'MIC 3.2.4 でモーフィングができるか試してみた。
環境は、Windows10 x64 22H2 + GIMP 2.10.34 Portable。CPU は AMD Ryzen 5 5600X。
モーフィングと言うのは、2枚の異なる画像から、その中間の画像を生成する処理、という説明でいいのだろうか…?
_モーフィング - Wikipedia
GIMPの標準機能だけではモーフィングはできないけれど、以下の組み合わせならモーフィングが使える。
- GIMP + G'MIC
- GIMP + GAP (GIMP Animation Package)
とりあえず今回は、GIMP 2.10.34 Portable + G'MIC 3.2.4 でモーフィングができるか試してみた。
環境は、Windows10 x64 22H2 + GIMP 2.10.34 Portable。CPU は AMD Ryzen 5 5600X。
◎ 必要なソフト :
GIMP と G'MIC が必要。
_GIMP Portable (image editor) | PortableApps.com
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Download
_GIMP Portable (image editor) | PortableApps.com
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Download
◎ 作業手順 :
まず、元になる2枚の画像を、レイヤーとして読み込んでおく。
フィルター → G'MIC-Qt を選択。
Deformations の中の、Morph [Interactive] を選択する。
この画面で、中間画像を何枚作るか指定できる。Number of Frames で、必要な枚数を指定。
また、この画面ではショートカットキーが説明されてる。一応、以下に引用しておく。OCRで読み取った結果なので、綴りが間違ってるかもしれんけど…。
基本的にはマウス操作で、制御点(キーポイント)の追加/移動/削除をしていく模様。
念のため、ざっくりと日本語でもメモしておく。
さておき。「OK」ボタンをクリックすると、2つのウインドウが表示される。
作業中は、G'MIC-Qtのウインドウの下のほうで、緑色の処理進行バーっぽいものがずっとアニメーションしてる。おそらく、「今現在 G'MIC が動いてますよ」と伝えてくれているのだと思う。
ソース/ターゲットウインドウは、ウインドウサイズを変更することもできるので、作業しやすい大きさに変更することを推奨。わざわざ小さいウインドウのままにしてチマチマと作業する必要はないです。
さて、ソース/ターゲットウインドウ上で、制御点(キーポイント)を追加していく。
この操作が、ちょっと説明しづらいのだけど…。
まあ、動画を見れば、なんとなくわかるだろうか…? 最初は戸惑うだろうけど、実際にやってみるとサクサク作業できるので、悪くない仕様だよなと…。
また、制御点を追加していくと、中間画像表示ウインドウ上の見た目がどんどん整っていくことが、上の動画でも分かるかと。
ちなみに、制御点を追加するたび、中間画像を全部生成し直しているようで…。制御点の数が増えてくると、目に見えて反応が遅くなってくる…。制御点を1つ追加するだけで数秒待たされる感じ…。
制御点を配置し終わったら、ソース/ターゲットウインドウの右上の閉じるボタンをクリックして、ウインドウを閉じる。すると、G'MICが中間画像を生成して、中間画像をGIMPのレイヤーとして追加してくれる。
この時、十数秒〜数十秒ほど待たされてしまうけど、ずっと計算処理をしている最中なので、フリーズしていると勘違いしないように。
GIMP上で、1フレーム=1レイヤーとして扱われている画像は、アニメーションを再生して様子を見ることができる。フィルター → アニメーション → 再生、を選択。
アニメーション再生ウインドウが開く。左上の再生ボタン(右向きの三角)をクリックすれば、再生される。
再生fpsを変更した場合は、上のほうの再読み込みボタンをクリックしないと反映されないので注意。
後は、アニメgifとして保存してもいいし、各レイヤーをエクスポートして連番画像にして動画編集ソフトに読み込んで使ってもいい。
ちなみに、各レイヤーをエクスポートできるプラグインは以下。何故か最初の一発目のpng保存でエラーが出て、再チャレンジすると正常にpng保存できるあたりが気になるけど…。
_Releases - kamilburda/gimp-export-layers
そんな感じで出来上がったアニメgifが以下になります。
頭のてっぺんのあたり、制御点の置き方を失敗している気がする…。そもそもこの元画像が、この手の処理のサンプル素材としては良くない気も…。でもまあ、これでモーフィングができることぐらいは分かるかなと。
フィルター → G'MIC-Qt を選択。
Deformations の中の、Morph [Interactive] を選択する。
この画面で、中間画像を何枚作るか指定できる。Number of Frames で、必要な枚数を指定。
また、この画面ではショートカットキーが説明されてる。一応、以下に引用しておく。OCRで読み取った結果なので、綴りが間違ってるかもしれんけど…。
Instructions: Use mouse buttons to add/move/remove correspondence keypoints over the interactive window that will appear, in order to create the morphing. Source/target window: - Left mouse button: Add new keypoint on current image and move it on the other one. - Right mouse button: Add/move keypoint on current image. - Key DELETE or middle mouse button: Delete keypoint. - Key SPACE or mouse wheel: Toggle source/target. In-between window: - Mouse wheel: Change morphing time, from 0 to 1. - Left mouse button: Reset morphing time to 0.5. Both windows: - Key TAB: Change keypoint radius. - Key ENTER Play/stop in-between animation. - Key R Reset keypoints. - Key K: Show/hide keypoints. - Keys ESC or Q: Process fullres and exit.
基本的にはマウス操作で、制御点(キーポイント)の追加/移動/削除をしていく模様。
念のため、ざっくりと日本語でもメモしておく。
ソース/ターゲットウインドウ : * 左ボタン : キーポイント追加、かつ、別画像に表示変更。 * 右ボタン : 現在画像上で、キーポイントの移動、もしくは追加。 * 中ボタン / Deleteキー : キーポイント削除。 * マウスホイール回転 / SPACEキー : ソースとターゲットの表示切替。 中間アニメーション表示ウインドウ : * マウスホイール : モーフィングタイム(現在表示中のフレーム)を、0から1の間で変更。 * 左ボタン : モーフィングタイムを0.5にリセット。 両方のウインドウ : * TABキー : キーポイントの半径(大きさ)を変更。 * Enterキー : 中間アニメーションの再生/停止。 * Rキー : キーポイントをリセット。全消去。 * Kキー : キーポイントの表示/非表示。 * Esc / Qキー : 処理をして終了。
さておき。「OK」ボタンをクリックすると、2つのウインドウが表示される。
- 1つが、ソース/ターゲットウインドウ。
- もう1つが、中間画像がどうなるかアニメーションで表示されるウインドウ。
作業中は、G'MIC-Qtのウインドウの下のほうで、緑色の処理進行バーっぽいものがずっとアニメーションしてる。おそらく、「今現在 G'MIC が動いてますよ」と伝えてくれているのだと思う。
ソース/ターゲットウインドウは、ウインドウサイズを変更することもできるので、作業しやすい大きさに変更することを推奨。わざわざ小さいウインドウのままにしてチマチマと作業する必要はないです。
さて、ソース/ターゲットウインドウ上で、制御点(キーポイント)を追加していく。
この操作が、ちょっと説明しづらいのだけど…。
- マウスの左ボタンを押した段階で、その位置に制御点が作られて、
- それと同時に、もう一つの画像に表示が切り替わるので、
- マウスの左ボタンを離さずにそのままドラッグして、
- 目標の位置に来たら、そこでようやく左ボタンを離す、
まあ、動画を見れば、なんとなくわかるだろうか…? 最初は戸惑うだろうけど、実際にやってみるとサクサク作業できるので、悪くない仕様だよなと…。
また、制御点を追加していくと、中間画像表示ウインドウ上の見た目がどんどん整っていくことが、上の動画でも分かるかと。
- マウスホイール回転、もしくは SPACEキーで、2枚の画像の表示を切り替えて様子を見たり。
- 右ボタンで、制御点の位置を変更したり。
- Enterキーを押して、中間画像をアニメーション表示して具合を見たり。
ちなみに、制御点を追加するたび、中間画像を全部生成し直しているようで…。制御点の数が増えてくると、目に見えて反応が遅くなってくる…。制御点を1つ追加するだけで数秒待たされる感じ…。
制御点を配置し終わったら、ソース/ターゲットウインドウの右上の閉じるボタンをクリックして、ウインドウを閉じる。すると、G'MICが中間画像を生成して、中間画像をGIMPのレイヤーとして追加してくれる。
この時、十数秒〜数十秒ほど待たされてしまうけど、ずっと計算処理をしている最中なので、フリーズしていると勘違いしないように。
GIMP上で、1フレーム=1レイヤーとして扱われている画像は、アニメーションを再生して様子を見ることができる。フィルター → アニメーション → 再生、を選択。
アニメーション再生ウインドウが開く。左上の再生ボタン(右向きの三角)をクリックすれば、再生される。
再生fpsを変更した場合は、上のほうの再読み込みボタンをクリックしないと反映されないので注意。
後は、アニメgifとして保存してもいいし、各レイヤーをエクスポートして連番画像にして動画編集ソフトに読み込んで使ってもいい。
ちなみに、各レイヤーをエクスポートできるプラグインは以下。何故か最初の一発目のpng保存でエラーが出て、再チャレンジすると正常にpng保存できるあたりが気になるけど…。
_Releases - kamilburda/gimp-export-layers
そんな感じで出来上がったアニメgifが以下になります。
頭のてっぺんのあたり、制御点の置き方を失敗している気がする…。そもそもこの元画像が、この手の処理のサンプル素材としては良くない気も…。でもまあ、これでモーフィングができることぐらいは分かるかなと。
◎ GIMPの減色処理を疑ってしまった :
GIMP 2.10.34 の減色処理というか、インデックスカラーへの変換処理が、なんだかおかしいような…? どうして一定間隔で白い点が入るの? ちなみに、GIMP 2.8.22 Portable でインデックスカラーに変換してみても同じ結果になったので、GIMP 2.10 でエンバグしてるわけではなさそう。まあ、元々 GIMP の減色処理は品質が非常に悪いというのが定評なのだけど…。
試しに、GIMP から各レイヤーをpngでエクスポートして、ffmpeg でアニメgifにしてみた。一旦パレット画像(palette.png)を抽出してから、そのパレット画像を元に減色してアニメgifにする方法を試している。
GIMPで生成した版と比べると、アルファチャンネルに対してディザをかけられなくて、しきい値で2値化されてしまうのがアレだけど、それ以外はGIMPの処理結果より全然マシに見える。
以下のページが参考になった。ありがたや。
_ffmpeg で 256色を最適化する palettegen, paletteuse | ニコラボ
_ffmpegでGIFアニメを作る - 脳内メモ++
と、ここまで書いて気が付いた。もしかして、GIMPのソレは透過部分にディザをかけているのがいかんのではないか。ffmpeg と同様に、アルファチャンネルをしきい値で2値化したら違う結果にならないか…? 試してみた。
一定間隔で点々が入ってない。つまり元画像のアルファチャンネルに微妙な値が入ってしまっていたのが原因だった模様。GIMPの減色処理の品質云々は、冤罪だった…。
試しに、GIMP から各レイヤーをpngでエクスポートして、ffmpeg でアニメgifにしてみた。一旦パレット画像(palette.png)を抽出してから、そのパレット画像を元に減色してアニメgifにする方法を試している。
ffmpeg -i export_layers\%04d.png -vf palettegen=max_colors=256:reserve_transparent=1:transparency_color=lime:stats_mode=full -update 1 -frames:v 1 palette.png -y ffmpeg -f image2 -framerate 12 -r 12 -i export_layers\%04d.png -i palette.png -filter_complex paletteuse=dither=bayer:bayer_scale=2 -r 12 gimp_gmic_morph_test_by_ffmpeg.gif -y
GIMPで生成した版と比べると、アルファチャンネルに対してディザをかけられなくて、しきい値で2値化されてしまうのがアレだけど、それ以外はGIMPの処理結果より全然マシに見える。
以下のページが参考になった。ありがたや。
_ffmpeg で 256色を最適化する palettegen, paletteuse | ニコラボ
_ffmpegでGIFアニメを作る - 脳内メモ++
と、ここまで書いて気が付いた。もしかして、GIMPのソレは透過部分にディザをかけているのがいかんのではないか。ffmpeg と同様に、アルファチャンネルをしきい値で2値化したら違う結果にならないか…? 試してみた。
一定間隔で点々が入ってない。つまり元画像のアルファチャンネルに微妙な値が入ってしまっていたのが原因だった模様。GIMPの減色処理の品質云々は、冤罪だった…。
◎ GAPのモーフィングについて :
GIMP + G'MIC だけではなく、GIMP + GAP でもモーフィングはできるのだけど…。
- 作業ウインドウ上で画像の拡大表示ができない。Windowsの拡大鏡等を併用しないとツライ。
- 左右に画像が表示されていて、その間をマウスカーソルが行き来することになる。
- 結果をプレビュー再生できない。
◎ フレーム補間とモーフィングについて :
先日利用したフレーム補間ツール FILM と、今回利用したモーフィングについて、違いは何だろうと考えてみたのだけど…。
フレーム補間は、制御点を人間様が指定しなくても済むのは便利だなと。自動でイイ感じにやってくれる。その代わり、2枚の画像の変化量が大きい時は対応できなくて、中間画像が崩れてしまったりする。
モーフィングは、人間様が制御点を一々指定しないといけないのがツラい。その代わり、2枚の画像の変化量が大きくても、人間様の指定次第で、中間画像の破綻を少なくすることができそう。
画像の変化が少ない時はフレーム補間で済むだろうし…。変化が大きかったり、あるいは、こちらの思った通りにちゃんと動かしたかったら、作業時間はかかるけどモーフィングで、という感じになるのだろうか…?
フレーム補間は、制御点を人間様が指定しなくても済むのは便利だなと。自動でイイ感じにやってくれる。その代わり、2枚の画像の変化量が大きい時は対応できなくて、中間画像が崩れてしまったりする。
モーフィングは、人間様が制御点を一々指定しないといけないのがツラい。その代わり、2枚の画像の変化量が大きくても、人間様の指定次第で、中間画像の破綻を少なくすることができそう。
画像の変化が少ない時はフレーム補間で済むだろうし…。変化が大きかったり、あるいは、こちらの思った通りにちゃんと動かしたかったら、作業時間はかかるけどモーフィングで、という感じになるのだろうか…?
[ ツッコむ ]
以上です。