猫の手ツール

AI & Image Processing

瞳の色を変える数学とAI:虹彩レタッチの仕組み

MediaPipeが推定した目と虹彩の位置を使い、虹彩部分の拡大、明るさ、色を調整します。顔の形を新しく生成するのではなく、元写真の一部の描画範囲と重ね方を変える処理です。

このツールの入力から出力まで

現行コードの確認日:

入力
人物写真と虹彩の色・濃さ・明るさ・大きさを指定します。
処理
FaceLandmarkerの目の輪郭でクリップし、虹彩付近の拡大と色の重ね合わせを行います。
出力
JPEG品質0.95で保存します。

まず確認する点:大きさと明るさは別の操作です。眼鏡の反射や閉じた目で推定がずれると、色がまぶたへ乗るため両目を拡大します。

仕上がりの例

人物の瞳を青色に変えた例です。

加工前・加工後
左は人物の顔写真。右は瞳の色を青色に変えた顔写真。

サンプルにはAIで生成した架空の人物画像を使用しています。

加工前・加工後

左は人物の顔写真。右は瞳の色を青色に変えた顔写真。

掲載画像はサイトにある既存の公開作例です。保存済みの資料ではAIで作成した架空の人物・手の画像を使用しています。今回の確認日が、この作例を実行した日を表すわけではありません。

保存済み検証記録の条件を見る

資料の種類は「ツールの出力画像を保存した記録」です。公開作例と保存済み記録で素材や色などが異なる場合があるため、下の数値は保存済み検証記録の条件として読んでください。

記録の入力画像
1788×2400px (JPEG)
記録の出力画像
1117×1500px (JPEG)
保存済み記録の主な操作・出力条件
画面の項目記録の値現行コードの初期値・範囲
色#1976d2初期値 #1976d2
デカ目強度(瞳のサイズ)0初期値 0 / 範囲 0〜100
元の瞳の明るさ(透過度)0初期値 0 / 範囲 0〜50
発色の鮮やかさ50初期値 50 / 範囲 0〜100

記録では「この画像で保存へ進む」から完成表示へ進んでいます。初期値と記録値を比べてから、効果を1項目ずつ変えると作用を確認しやすくなります。

資料ファイルの作成日は実行日として扱っていません。個別端末の処理速度や、ほかの写真に対する検出・加工の精度を測定した資料でもありません。

実装の確認箇所:src/pages/ai/face-lan/eye-color/index.astro。以下のコード抜粋と出力条件は、この本番実装に基づいて説明します。

仕組みを読み進めるときは、MediaPipeの顔ランドマーク(顔の点を使う描画と変形)、Canvas APIと画像処理(画像寸法、drawImage、画素と透明度の扱い)が参考になります。

1. 「まぶたを突き抜けない」オクルージョン・マスク制御

瞳を大きくしたり色を塗ったりする際、単純に円を描画すると、まぶた(上下のアイライン)の上に色が乗ってしまい、非常に不自然な仕上がりになります。これを防ぐため、本ツールではMediaPipeから取得した「眼球の輪郭(Contour)」をクリッピングパスとして使用しています。

AIが検知した478点の頂点から特定のアイライン座標を抽出し、ctx.clip()を実行することで、推定した目の輪郭の内側へ描画を制限するオクルージョン(隠蔽)処理を実現しています。

虹彩の中心と端の推定点から拡大半径を求める例です。sizeは0〜100の設定で、最大時には半径を1.4倍にします。

function irisRadius(center, edge, w, h, size) {
  const original = Math.hypot((edge.x - center.x) * w,
    (edge.y - center.y) * h);
  return {original, target: original * (1 + size / 100 * 0.4)};
}

2. 複層ブレンドモードによる「虹彩の奥行き」再現

カラコンの着色において、単純な半透明塗り(globalAlphaのみ)では、瞳の質感が失われて「のっぺり」してしまいます。本ツールでは、CanvasのglobalCompositeOperationを切り替えながら、2段階の合成を行っています。

  • Overlay(オーバーレイ): 元の明暗を使いながら色を重ねます。元写真の暗さや設定によって見え方は変わります。
  • Multiply(乗算): 瞳の縁(フチ)や暗部を強調し、カラコン特有の奥行きと力強さを加えます。

この2つの層を、中心から外側へ広がる「放射状グラデーション(Radial Gradient)」と組み合わせることで、虹彩に色の濃淡を付けています。光の屈折を物理的に計算する処理ではありません。

出力の仕様と確認する点

「大きさ」は元の虹彩付近を切り出して拡大する設定です。「明るさ」はその部分の透明度を下げ、背後に白を描きます。「色の濃さ」は色合成の透明度を変えるため、それぞれ異なる作用があります。

モデルの設定は最大10人、入力の長辺は最大1500pxです。JPEG品質0.95で保存します。メガネの反射、閉じた目、横顔などでは輪郭が合わない場合があるので、拡大して両目の境界を確認します。

推定された目の形でクリップしても、推定自体がずれていれば色がまぶたに乗る場合があります。実際のカラーコンタクトの装着感や発色を再現・予測するシミュレーターではありません。

制作時に確かめたこと