Geometry & Mathematics
数式で導く完全なシンメトリー。
AI左右対称顔合成のロジック
ただ画像を半分に切って反転させるだけでは、不自然な合成になってしまいます。AIが検知した「顔の傾き」を座標変換で補正し、数学的に正しい中心線で反転させる実装の裏側を解説します。
このツールの入力から出力まで
現行コードの確認日:
- 入力
- 人物写真を選び、残す左右の側と中心線の位置・角度を指定します。
- 処理
- 推論結果の最初の顔から中心線を決め、片側の画素を反転してもう片側へ描きます。
- 出力
- 出力はJPEG品質0.95です。
まず確認する点:複数人の写真では意図した顔が最初になるとは限りません。顔だけでなく髪・耳・背景も鏡写しになる点を確認します。
仕上がりの例
顔の左右の半分を使って、左右対称にした例です。
サンプルにはAIで生成した架空の人物画像を使用しています。
掲載画像はサイトにある既存の公開作例です。保存済みの資料ではAIで作成した架空の人物・手の画像を使用しています。今回の確認日が、この作例を実行した日を表すわけではありません。
保存済み検証記録の条件を見る
資料の種類は「ツールの出力画像を保存した記録」です。公開作例と保存済み記録で素材や色などが異なる場合があるため、下の数値は保存済み検証記録の条件として読んでください。
- 記録の入力画像
- 1788×2400px (JPEG)
- 記録の出力画像
- 1117×1500px (JPEG)
| 画面の項目 | 記録の値 | 現行コードの初期値・範囲 |
|---|---|---|
| 記録で選択されていた項目 | 画面の【左】顔ベース | — |
| 中心線のズレ調整(X軸) | 0 | 初期値 0 / 範囲 -100〜100 |
| 顔の傾き補正 | 0 | 初期値 0 / 範囲 -30〜30 |
記録では「この画像で保存へ進む」から完成表示へ進んでいます。初期値と記録値を比べてから、効果を1項目ずつ変えると作用を確認しやすくなります。
資料ファイルの作成日は実行日として扱っていません。個別端末の処理速度や、ほかの写真に対する検出・加工の精度を測定した資料でもありません。
実装の確認箇所:src/pages/ai/face-lan/face-symmetry/index.astro。以下のコード抜粋と出力条件は、この本番実装に基づいて説明します。
仕組みを読み進めるときは、MediaPipeの顔ランドマーク(顔の点を使う描画と変形)、Canvas APIと画像処理(画像寸法、drawImage、画素と透明度の扱い)が参考になります。
1. 「顔の傾き」を数式で算出し、座標系を回転させる
写真の中の顔は、必ずしも垂直に写っているとは限りません。本ツールでは、AI(MediaPipe)が検知した「鼻筋の上部」と「顎の下」の2点を結ぶ線から、顔の傾き角度を Math.atan2 で算出しています。
Canvasの rotate メソッドを使用して、算出した角度分だけ一時的に座標系を回転させることで、写真が斜めであっても「常に鼻筋が垂直な状態」でクリッピングと反転を行うことができます。中心線は推定値なので、検出がずれた写真や横顔では手動での位置・角度調整が必要です。
2点から反転軸の角度を求める例です。topとbottomはランドマーク、w・hはCanvas寸法、degreesは手動補正の角度です。
function symmetryAxis(top, bottom, w, h, degrees, offset) {
const tx = top.x * w, ty = top.y * h;
const bx = bottom.x * w, by = bottom.y * h;
return {x: (tx + bx) / 2 + offset, y: (ty + by) / 2,
angle: Math.atan2(bx - tx, by - ty) + degrees * Math.PI / 180};
} 2. Canvasトランスフォームによる「非破壊的」な水平反転
画像の反転処理において、ピクセルデータを1つずつ配列で操作するのは処理負荷が大きく、高解像度画像ではカクつきの原因になります。本ツールでは、Canvasの変形マトリクス(ctx.scale(-1, 1))を活用し、Canvasの座標系を反転して元画像を描画しています。GPUの利用や処理速度はブラウザの実装にも依存します。
特定の半分を clip() で保護した上で、座標系を水平方向にマイナス1倍することで、指定した軸に対する鏡像を作ります。画像の端を超える範囲に新しい写真の内容を補完する処理はありません。
出力の仕様と確認する点
検出設定は最大10人ですが、合成に使うのは推論結果の最初の顔です。複数人の集合写真では、意図した人が選ばれない可能性があります。
残す側の選択に加え、中心線の横位置を-100〜100px、角度を-30〜30度の範囲で調整できます。数値は実寸のミリメートルではなく、長辺1500px以下へ縮小した処理画像に対する値です。
出力はJPEG品質0.95です。片側をコピーしているので、髪、耳、服、背景も反転します。結果は見た目を楽しむ合成であり、顔の健康状態や美しさの評価ではありません。
