このブログのアバターを作り直しました。元はこれです。
![]()
左右対称の狼の顔に、太いフチとつり目。アイコンとしては分かりやすいのですが、茶色一色で平坦なうえに 300px しかなく、サイドバーいっぱいに広がる PC 表示ではボケていました。「もうちょっとかっこよく」したい、というのが出発点です。
作業は AI(Claude) に相談しながら進めました。画像の生成には、手元の Mac(M5 / 32GB)で動かしている ComfyUI と flux1-schnell-fp8 を使っています。
60枚並べても決まらない
最初は SVG で手描きした4案を比べましたが、決めきれませんでした。そこで方向性そのものを探すために、ComfyUI でまとめて生成しました。
- 768×768、4 steps、cfg 1.0、euler / simple
- 1枚あたり約22秒(スタイルが変わって最初の1枚だけ約70秒)
「かっこいい系」は、フラットなエンブレム、ローポリ、eスポーツのマスコット、ネオンなど8スタイル × 3シードで24枚。確かにかっこいいのですが、並べるとスポーツチームのロゴに見えてきます。ブログの顔としては強すぎました。
次に、デフォルメした「かわいい系」を6スタイル × 3シードで18枚。ここで AI 側は「オレンジの毛色のせいで、狐や柴犬に見える」と判断して、毛色を変えた作り直しを提案しました。
見る側がそう見えているなら、それが正解です。この時点で「狼に見えるか」は検討から外れました。
決め手は「キティーの世界観」
かっこよくしたい、でもかっこよさを追うとスポーツチームになる。その板挟みを抜けたのは、この一言でした。
ハローキティーの世界観の狼にできませんか?
サンリオのキャラクターは、目が点で、鼻が小さく、口がないことが多い。今のアバターの「左右対称・太いフチ・山吹色×茶色」を残したまま、顔のパーツだけを極端に簡素にする、という方向がここで決まりました。プロンプトに in the style of classic sanrio characters と入れて、目の描き方を変えた6スタイル × 3シードを生成し、その中から選んだのがこれです。

kcool_22(クール目のシード22)。輪郭も配色もほぼ理想でしたが、目にまつ毛が付いていました。これを取りたい。
目だけ AI で直そうとして失敗した
目以外は完成しているので、目の部分だけマスクして描き直す(インペイント)のが素直な手です。SetLatentNoiseMask で目の周りだけにノイズを乗せ、denoise 0.9 で生成しました。
結果は2つの問題が出ました。
- まつ毛が残る。 プロンプトに
no eyelashesと書いたのに、しっかりまつ毛が描かれる - 目の周りがぼやける。 マスクの範囲が、周りより明るいにじみとして残る
1つ目は、否定の言葉が効かないパターンです。Flux は cfg 1.0 で動かすのでネガティブプロンプトも使えず、eyelashes という単語を書いた時点で、かえってまつ毛を呼び込んでしまいます。
そこで、目を毛の色で塗りつぶしてから denoise 1.0 にし、プロンプトも「黒く塗りつぶした線の目」のように肯定形だけで書き直しました。それでもまつ毛は戻ってきて、にじみも消えませんでした。「サンリオ風のかわいい顔」という指示自体が、まつ毛の方向に引っ張っているようです。
図形で描いたほうが早かった
ここで方針を変えました。元の絵はフラットな塗りなので、目はただの黒い図形です。AI に描かせるより、図形として描いてしまえばいい。
手順は単純です。
- 目の周りを、毛の色で塗りつぶして消す
- 4倍の解像度で目のポリゴンを描き、縮小してアンチエイリアスをかける
- 片目だけ描いて、左右反転でもう片方を作る(完全に左右対称になる)
Python の Pillow だけで済み、1枚の出力は一瞬です。形・角度・大きさを数値で指定できるので、「もう少し丸く」「1.2倍に」といった注文にそのまま応えられます。AI の生成は毎回別の絵になりますが、図形なら変えたいところだけが変わります。
ここからは1か所ずつ詰めていきました。線の目、アーモンド形、三角形、角を丸めた鋭い目……と試すうちに、最終的に選んだのは元のアバターの目でした。300px の旧アバターから目の形をしきい値で切り出し、16倍に拡大して、新しい顔に移植しています。

角を丸めるのは、形をぼかしてからしきい値で2値に戻す方法です。ここで一度、目の両端が垂直にスパッと切れる不具合が出ました。切り出した目の形が画像の端ぎりぎりまであったので、ぼかしたときに画像の外が端の色で埋まり、先端が伸びて切れたのが原因です。周りに余白を足してからぼかすと直りました。
pad = eye.width // 5
padded = Image.new("L", (eye.width + 2 * pad, eye.height + 2 * pad), 0)
padded.paste(eye, (pad, pad))
rounded = padded.filter(ImageFilter.GaussianBlur(r)).point(lambda v: 255 if v > 128 else 0)眉と耳を足し引きする
目が決まってから、顔の他の部分も整理しました。

- 眉を消す:額の白い眉マークを毛の色で塗りつぶした
- 耳の中を無地にする:耳の内側にあった黒いギザギザの毛とグレーの影を、クリーム色一色にした
- 眉を戻す:無地の耳のまま、眉だけ戻した
耳の黒い毛は、耳のフチ(同じ黒)と区別する必要があります。ここは「黄色い背景から離れている黒」だけを選びました。フチは必ず背景のすぐ隣にあり、耳の中の毛は背景から遠い、という位置の違いを使っています。
眉は一度消してみて、やっぱり戻しました。消すと顔はすっきりしますが、表情が少し平坦になります。こういう判断は、実際に両方を並べて見るまで分かりません。一覧ページに全部並べて、見比べながら決めました。
最終的に選んだのは k22b_smalllong です。600px のアバター、light / dark の各サイズのファビコン、記事内の吹き出しアイコン(この記事の右側に出ているもの)まで、すべてこの画像から作っています。
教訓
- AI は「方向を探す」のに強い。 60枚並べたことで、かっこいい系がスポーツチームになること、デフォルメなら狼らしさが残ることが見えた
- 細部の修正は、AI に頼むより図形で描くほうが早いことがある。 フラットな絵なら、目は黒い図形にすぎない。数値で直せば、変えたいところだけが変わる
- 決め手は人の一言だった。 「キティーの世界観の狼」も「狼に見えています」も、生成結果をいくら眺めても出てこない判断だった
あとからなんですけど狼というか狐でしたw


狼に見えないという意見ですが、全然狼に見えています。