GREE Engineering

アニメ動画へのリファレンス画像を使った自動彩色

アニメ動画へのリファレンス画像を使った自動彩色

どーもちょびえです。ここ数年のライフワークは映像でして、アニメらへんの技術とか見たり再現などちまちまやっております。

今日は、アニメ動画へのリファレンス画像を使った自動塗り手法というのを紹介します。
個人の趣味開発でやっている部分の技術的な内容についての解説です。

背景

アニメらしさとはなんだろう?という事で、実際作ってみないとわからないので自分でもデータを作って動きや撮影の再現等をやっています。
アニメに惹かれて、自分でも作ってみたいと思ったのが数年前なんで紆余曲折しながらもどこかに進んでいると思います。

自分は絵に関しては引き出し無いので、動画(※ここでは1フレームのあるセルの画像データを指します)書いて、色塗ってみて、動かしてみて、撮影工程入れて、なんか思ってたのと違う…のでまた書き直し。
と、検証やっているとひたすらに時間が過ぎていきます。線描くのが上手ならまだしも、1秒のデータつくるのも数時間、その動画に色塗るのも数時間…
仕上げ・彩色と呼ばれる工程はめちゃくちゃ重要なのですが検証のための雑なトライアンドエラーをやるには地味に時間がかかります。

24fpsで3コマ打ちの動画としても1秒8枚。複数セル組だとさらに増える。
おまけにFull HDでのデータ作成であれば1920×1080で2,073,600ピクセル。2百万ピクセルもある中から適切に塗っていかないといけない。
バケツ塗りなんで多少楽ですが、それでも1枚10分ちょっとぐらいかかって塗って8枚で1時間ちょっとかかってしまいます。

いやいや、そもそも、わたくしプログラム書く人ですし、プログラムの力でなんとかできないか?ということで試しにやってみました。

前提条件

・実線は2値データとする(アンチエイリアスなし)
・影線はあってもよい(特定色を影線として扱う)
・すべてのデータはクリンナップ(すべて閉領域化)が終わっている状態
・アニメ動画という性質上、全てとは言えないが基本的に前フレームとの類似度が高いという特徴がある
・リファレンス画像に関してはインデックスカラーに近い状態(アンチエイリアスなし)

自分的には7~8割ぐらいの精度で塗ってくれれば検証が捗るのでそれでも十分という感じの雑さです。

手始めに

では具体的に閉領域はどの程度あるのか、という事で手慣らしで単純なデータについて領域分割をやってみます。
ネコっぽい物体の画像を書いたので、これをプログラムから力づくで領域分割してどこに何があるかを分かる状態にしていきます。

試しにやってみた所、閉領域は17箇所、色数は6色ありました。

領域分けの手法に関してはあまりアニメ系の2値実線+影線での領域分割という手法が見つからなかったのでシンプルに塗ったかどうかのメモ用のStencilBufferを併用しながら全ピクセルをfloodfillしています。

コレぐらいの雑な絵だったらサクッと塗れますが、枚数あったらそれはそれで地味にしんどいですね。実際のアニメだとモノにもよりますが1枚のセルで数百領域、数十色程度いくこともザラかと思います。

自動で塗ってみる

全ての領域さえわかってしまえばこっちのもんです。

入力Aと入力Bの画像から各領域計算をしたら、古典的AIを用いて入力Bの領域に対して入力Aの領域に類似する部分をそれぞれ算出していきます。
特に根拠がある手法ではないので内容は割愛しますが、ベースとしては領域の位置、サイズ、形状から類似度を算出しています。

ざっくり説明だとこんなかんじ。

類似部分の計算が終わったら、入力Bの特定領域に対して、入力Aの類似部分-確信度が高い領域-のピクセルをバケツ塗りしていきます。

リファレンス画像(入力A) 入力画像(入力B)

と、プログラムから自動で塗ってみたものがコレ。

さらに別サンプルとして影色ありの単純な3枚な絵を準備し、これに対しても塗ってみます。

リファレンス画像 入力画像1 入力画像2

間違って影線1を赤にしてしまったけど、まぁ、まぁ・・・。

リファレンス画像 入力画像1′
(リファレンス画像+入力画像1)
入力画像2
(入力画像
1’+入力画像2)

うまく塗れていますね。

塗りの精度に関しては閉領域の類似計算の精度によるので、なにか素晴らしい手法が出てくればもっとまともに塗れるようになるはず。

参考までに、同プロセスを動画で撮ったものも上げておきます。

今後の課題

・含み塗りのきちんとした対応
 ・影色、2影色等の判断が何もない状態だと影線を意図通り消していくのがやりづらいので方法の検討
・自動塗りしたとしても妥当性のチェックが人手
 ・塗りミスかどうかは人の目で見ないと判断が難しい(領域間の関連性を見ていかないと正しいかどうかの確信が得られない)
 ・自動彩色後のクリンナップ自体は別途必要
・精度を上げる
 ・サンプル増やしていきつつ調整
・速度の向上
 ・1920×1080だとそれなりに類似領域の演算に時間がかかる。
  実際のアニメだと閉領域は数百程度に登ることもあるので類似領域計算の高速化は必要
・例外への対応
 ・うまくいくケースだけではない

という感じでございます。手元のもっと実際のアニメに近い検証データではわりと8~9割塗れているので自分的には満足しています。

彩色工程自体は楽しいんですが、実験用にクオリティよりも枚数こなしたいとなると、どうしても自動化できないかと思ってしまう部分です。検証をすすめる上で出てきた技術ではありますが何かの参考になれば。

課題になりそうなのがあったら広く浅くジャンル問わず解決していくスタイル。最近もっぱらUnity使うので言語はC#メインですが以前はPHP, Go, Cをよく書いていたなんでもやさん。 利用ツール: Unity, Photoshop, ClipStudio, Blender, ZBrush, houdini, AfterEffects, FilterForge, SubstanceDesigner, Illustrator, Maya, Cubaseなどなど

関連記事