はじめに
2026-08-07、LINE スタンプ用に、1人のキャラクターから表情とポーズの差分を量産する仕組みを試した。
- ベースの絵: Z-Image-Turbo(8bit 量子化)
- 差分の生成: Qwen-Image-Edit-2511(元画像を渡して部分的に描き換える画像編集モデル)
- ライセンス: どちらも Apache 2.0
同じキャラクター設定を3つの絵柄で描いて比べた。
| 絵柄 | 特徴 |
|---|---|
| アニメ | 塗りのある、色の多い絵 |
| 漫画 | 白黒の線画。色を使わない |
| 落書き | 手描き風の、色のある絵 |
差分は、9マスのグリッドに9種類を並べた1枚の画像として、まとめて描き換える。描き換えの強さ(denoise)は 0.80。
表情だけなら、白黒は保たれた
最初は表情の差分9種類を9マスに入れた。体の形は変えず、顔だけを描き換える差分になる。
漫画の絵柄で、画像の平均彩度(HSV の S を 0〜100 で平均したもの)を測った。
| 画像 | 平均彩度 |
|---|---|
| ベース | 2.9 |
| 表情9マス(各マス) | 1.6〜2.4 |
ほぼ動いていない。髪型、服、小物といったキャラクターの特徴も、3つの絵柄とも崩れなかった。
ポーズを変えると、白黒が崩れた
次にポーズの差分9種類を、同じ 9マス・denoise 0.80 で描き換えた。
漫画の絵柄が崩れた。白い上着に赤が乗り、白黒の絵ではなくなった。
平均彩度に加えて、画像のうち「色が付いている画素」と「赤い画素」の割合も数えた(彩度 0.35 超かつ明度 0.25 超を色付き、そのうち色相が 340〜20度を赤とした)。
| 画像 | 平均彩度 | 色付き画素 | 赤い画素 |
|---|---|---|---|
| ベース | 2.9 | 1.17% | 0% |
| 表情9マス | 1.6〜2.4 | 0.82〜1.68% | 0% |
| ポーズ P1〜P8 | 4.4〜5.8 | 6.26〜8.78% | 5.21〜7.54% |
| ポーズ P9 | 1.9 | 1.17% | 0% |
ポーズを変えた8枚は、すべてに赤が乗った。
denoise を下げても変わらなかった
最初に立てた見立ては「描き換えが強すぎる」だった。1枚ずつポーズを変えたときにも同じように色が乗っていたので、グリッドにまとめて denoise 0.80 に抑えれば、絵柄の拘束が効くはずだと考えた。
結果は上の表のとおりで、グリッドに入れても改善しなかった。原因は denoise ではなかった。
1枚だけ白黒を保ったポーズ
崩れなかった P9 は「指を1本立てる」ポーズ。体はほぼそのままで、手先だけが動く。
1枚ずつ試したときに色が乗ったのはバンザイで、両腕ごと体の輪郭が変わる。
表情の差分も、顔の中だけの小さな描き換えで済む。動かす面積が小さいほど、絵柄は残る。 体の形を大きく描き換えるほど、モデルは絵柄の拘束も一緒に外していた、と読める。
色のある絵柄では露見しない
同じポーズの差分を、アニメと落書きの絵柄でも測った。
| 絵柄 | ベース | ポーズ9マス |
|---|---|---|
| アニメ | 9.7 | 8.2〜10.9 |
| 落書き | 11.4 | 9.9〜12.0 |
もともと色のある絵柄では、彩度はベースの前後に収まる。色が少し動いても、絵柄が抜けたとは見えない。白黒や限られた色の絵柄だけで、この問題は表に出る。
対策は、生成のあとで色を落とすこと
プロンプトに no colour と書く方法は効かなかった。ベースを生成する時点でも、白黒の指定にもかかわらずマフラーに黄色が残っていた。
効く順に並べるとこうなる。
- 白黒・限定色の絵柄は、生成のあとで決定論的に変換する。 グレースケール化や減色は、モデルの気分に左右されない
- 色のある絵柄を選ぶ。 アニメと落書きでは、この問題は起きていない
- 大きなポーズがどうしても要るなら、絵柄を戻す工程を後段に置く(ネガティブプロンプトの強化は未検証)
測定に使ったのは次のコード。
from PIL import Image
import numpy as np
def color_stats(path):
a = np.asarray(Image.open(path).convert("HSV")).astype(float)
h, s, v = a[..., 0] * 360 / 255, a[..., 1] / 255, a[..., 2] / 255
colored = (s > 0.35) & (v > 0.25)
red = colored & ((h < 20) | (h > 340))
return round(s.mean() * 100, 1), round(colored.mean() * 100, 2), round(red.mean() * 100, 2)
平均彩度は絵柄が抜けたかの検出には使える。ただ、差分として採用できる絵かどうかの判定には使えない。構図や表情の出来は、この数値には出てこない。
時間は、3絵柄×10種類の30枚で68分かかった(ベース約58秒/枚、9マス1枚で約13分)。ポーズのグリッドを足した分が41分。
描き換えが強すぎるから色が乗る、と思っていた。
弱めても変わらなかった8枚の横で、指を1本立てた1枚だけが白黒のままだった。

