ComfyUIのインペイントは、Load ImageのMASK出力を「VAE Encode (for Inpainting)」または「Set Latent Noise Mask」に渡し、そのlatentをKSamplerに入れるだけで組めます。img2imgとの違いは「ノイズを足す場所をマスク範囲に限る」点で、境界が目立つときはマスクの形・denoise・周囲の文脈を一つずつ切り分けて直します。
情報確認日:2026年8月22日(日本時間)
結論:マスクで「やり直す場所」を限り、denoiseで「やり直す量」を決める
責任範囲
- inpaintingがimg2imgと何が違うかを、ノイズを足す範囲の違いから説明する
- 標準ノードだけの最小workflowと、3つのエンコード方式の使い分けを示す
- マスク範囲とdenoiseを同時に動かさない調整手順と記録表を示す
- 境界が目立つ原因を、マスク端・文脈不足・色差の順に切り分ける
- 大きい修正と小さい修正で設定の考え方が変わる理由を示す
- 修正履歴をseed・workflow JSON・元画像のセットで残す方法を示す
denoiseの意味とimg2imgの最小構成はComfyUIでimg2imgを使う方法で説明済みのため繰り返しません。Mask Editorのブラシ操作や画面の使い方は別記事で扱い、ここでは「マスクが用意できたあと」の設計に絞ります。
inpaintingはimg2imgと何が違うのか
img2imgは画像全体にノイズを足して全体をやり直します。inpaintingはマスクで指定した範囲だけにノイズを足し、それ以外は元のlatentをそのまま保ちます。やり直しの仕組み自体は同じで、違うのは「どこを」の一点です。
| 項目 | img2img | inpainting |
|---|---|---|
| ノイズを足す範囲 | 画像全体 | マスク範囲(とその周辺) |
| マスク外の画素 | 必ず少し変わる | 元のlatentを保つ(VAE往復の劣化は残る) |
| 必要な入力 | IMAGE | IMAGEとMASK |
| 向く用途 | 全体の画風・質感変更 | 一部の差し替え・除去・修復 |
| 難しさの中心 | 残す量の調整 | 境界のなじませ |
「マスク外は変わらない」はlatent上の話です。最後にVAE Decodeを通るため、マスク外も画素単位では元画像と完全一致しません。厳密に元の画素を残したい場合は、生成後にマスクで元画像と合成する工程を足します。
最小inpainting workflowを組む
img2imgのworkflowから「VAE Encode」を入れ替えるだけです。マスクはLoad ImageのMASK出力から取ります。MASKは画像のalpha channelから作られるため、透明部分を持つPNGを読み込むか、Load Imageの画像を右クリックしてMask Editorで塗ると供給できます。公式例示ページでは「Open in MaskEditor」というメニュー名ですが、現行UI(2026年8月時点)では表記が変わることがあるため、見当たらないときは公式ドキュメントで最新の名称を確認してください。
Load Checkpoint
MODEL ─→ KSampler.model
CLIP ─→ CLIP Text Encode (+/-) ─→ KSampler.positive / negative
VAE ─→ VAE Encode (for Inpainting).vae
VAE ─→ VAE Decode.vae
Load Image
IMAGE ─→ VAE Encode (for Inpainting).pixels
MASK ─→ VAE Encode (for Inpainting).mask
VAE Encode (for Inpainting)
grow_mask_by: 6(既定値)
LATENT ─→ KSampler.latent_image
KSampler
denoise: 1.0
LATENT ─→ VAE Decode.samples ─→ Save Image
標準ノードには、マスクをlatentに渡す方法が3つあります。どれを使うかで「denoiseをいくつにするか」の前提が変わるため、先に違いを押さえます。
| ノード | 内部で行うこと | denoiseの前提 | 向く場面 |
|---|---|---|---|
| VAE Encode (for Inpainting) | マスク下の画素を中間グレーに塗りつぶしてからencodeし、grow_mask_byで広げたマスクをnoise_maskとして持たせる |
1.0が前提(元の内容を捨てて描き直す) | 物体の除去、まったく別のものへの差し替え |
| Set Latent Noise Mask | ふつうにencodeしたlatentにnoise_maskを付けるだけ。元の画素情報は残る | 1未満で調整できる(img2imgと同じ感覚) | 形を保ったまま質感や細部を直す修正 |
| InpaintModelConditioning | positive / negativeのconditioningに画像とマスクを埋め込み、latentも出力する | modelによる。inpainting専用modelと組み合わせる | 専用modelで境界を含めて整合させたい場合 |
VAE Encode (for Inpainting)はソース上、マスク範囲の画素を0.5(中間グレー)に置き換えてからencodeします。つまり元の内容をあらかじめ消しているので、denoiseを下げても「元の形を少し残す」動きにはなりません。形を残したいならSet Latent Noise Maskを選びます。この違いを知らずにdenoiseだけいじると、いくら下げても元の絵が戻らない、という行き止まりに入ります。
公式チュートリアルはinpainting専用にtuningされたmodelを推奨しつつ、例示ページでは「It also works with non inpainting models」とも述べています。まずは手元のmodelで試し、境界の整合が取れないときに専用modelを検討する順で十分です。
マスク範囲とdenoiseを別々に調整する
inpaintingの調整変数は「マスクの面積と形」「grow_mask_byの広げ幅」「denoise」の3つです。同時に動かすと、境界が良くなった理由も悪くなった理由も分からなくなります。調整の順序を固定します。
- マスクを決める。直したい範囲より一回り大きく塗り、
grow_mask_byは既定の6のまま。seedをfixedにする - denoiseだけを振る。Set Latent Noise Maskなら0.4 / 0.6 / 0.8 / 1.0、VAE Encode (for Inpainting)なら1.0固定で次へ
- denoiseを固定して
grow_mask_byを振る。0 / 6 / 16 / 32で境界の変化だけを見る - 最後にマスクの形を直す。ここまでで境界が残る場合だけ、塗り直して1から繰り返す
seedの固定方法はComfyUIでSeedを固定する方法を参照してください。seedが毎回変わると、マスク内の生成内容が変わるたびに境界の見え方も変わり、どの変数が効いたか判断できません。
| 回 | エンコード方式 | denoise | grow_mask_by | マスク内は狙いどおりか | 境界は見えるか | 判定 |
|---|---|---|---|---|---|---|
| 1 | 6 | |||||
| 2 | 6 | |||||
| 3 | 6 | |||||
| 4 | (固定) | 0 | ||||
| 5 | (固定) | 16 | ||||
| 6 | (固定) | 32 |
表の値は比較の開始点で、推奨値ではありません。grow_mask_byは0〜64の整数で、公式ドキュメントには「マスクを外側に広げ、生成部分と元の部分の間に移行領域を作って硬い境界を避ける」とあります。広げるほど境界はなじみやすくなりますが、そのぶん元画像を描き換える範囲も広がります。
境界が目立つ原因を切り分ける
境界が見えるとき、原因は大きく3種類あり、見え方が違います。順番に疑います。
- マスク端が硬い。境界線がくっきりした輪郭として見える。
grow_mask_byが0、またはマスクの縁がぼかされていない状態。まずgrow_mask_byを増やし、Mask Editor側でも縁をぼかす - 文脈(context)が足りない。マスク内の内容は自然だが、周囲とつながっていない。マスクが直したい物体にぴったりすぎて、modelが周囲を参照できていない。マスクを一回り広げるか、修正対象の周囲を含めて切り出してから処理する
- 色差・明度差。形はつながっているのに色調が段差になる。VAE Decodeの往復差と、マスク内だけ別の光源で描かれたことが原因。promptに周囲の光と色を書き足すか、生成後に元画像とマスクで合成し、境界だけぼかす
1と2はinpaintingの設定で直せますが、3はinpaintingだけでは消えないことがあります。色差が残るなら、無理にdenoiseやgrow_mask_byを上げて全体を描き換えるより、合成工程を足すほうが元画像を守れます。
3つを同時に疑って全部の設定を変えると、直ったとしても再現できません。1回の試行で動かす変数は1つにし、結果を上の記録表に残してください。
大きい修正と小さい修正で設計が変わる
「顔を差し替える」と「手元の小物を消す」では、同じinpaintingでも設定の考え方がほぼ逆になります。
大きい修正(顔・上半身の差し替えなど)
- VAE Encode (for Inpainting) + denoise 1.0で、元の内容を捨てて描き直す
- マスクは広めに取り、
grow_mask_byも大きめにして周囲と一緒に描かせる - promptはマスク内に描きたいものを具体的に書く。空のpromptでは周囲の文脈だけで埋められる
- 解像度が低いとマスク内の情報量が足りないため、該当部分を切り出して拡大してから処理し、あとで戻す構成も検討する
小さい修正(小物の除去・指の修正など)
- Set Latent Noise Mask + denoise 1未満で、周囲の形を残しつつ書き換える
- マスクは対象ぎりぎりではなく、少し余裕を持たせる程度
- 除去なら、promptにはそこに「あるべき背景」を書く。消したいものの名前をpositiveに書かない
- 1回で消えなければ、denoiseを上げるより同じ設定でseedを変えて数回試すほうが副作用が少ない
どちらの場合も、マスク外に影響が出ていないかを毎回100%表示で確認します。特にgrow_mask_byを大きくしたとき、意図せず隣の要素まで描き換わっていることがあります。
修正履歴を残す
inpaintingは1枚の画像に何度も重ねて行うため、「どの元画像に、どのマスクで、どの設定を当てたか」を失うと戻れなくなります。1回の修正ごとに次の3点をセットで保存します。
| 保存するもの | 理由 | 方法 |
|---|---|---|
| 元画像(修正前)とマスク | やり直しの起点。マスクはalpha付きPNGで残すと再読み込みできる | Load Imageに読み込んだfileをinputから別folderへ複製 |
| workflow JSON | エンコード方式・grow_mask_by・denoise・promptがすべて入る |
workflowを書き出して保存。生成画像のmetadataにも埋め込まれる |
| seed | 同じ設定でも違うseedでは再現しない | JSONに含まれるが、記録表にも転記しておく |
workflow JSONの書き出し方、画像metadataからの復元、missing nodeの扱いはComfyUIのworkflow JSONを読み込む方法にまとめています。2回目以降の修正は「前回のSave Imageの出力」を次のLoad Imageに渡す形になるため、何回目の出力を元にしたかをfile名に入れておくと、履歴が一本の線で追えます。
project/
00_original.png
00_mask_face.png
01_face_v1.png # 00_original + 00_mask_face, seed 12345
01_face_v1.json
02_hand_v1.png # 01_face_v1 + 02_mask_hand, seed 12345
02_hand_v1.json
よくある質問
VAE Encode (for Inpainting)でdenoiseを下げても元の形が戻りません。
仕様どおりの動きです。このノードはマスク範囲の画素を中間グレーに置き換えてからencodeするため、元の内容はlatentに残っていません。形を残したい修正はSet Latent Noise Maskに切り替えてください。
マスク外の部分まで微妙に変わってしまいます。
VAE Encode→Decodeの往復で、マスク外も画素単位では元画像と一致しません。元の画素を厳密に保ちたい場合は、生成結果と元画像をマスクで合成する工程を最後に足します。
inpainting専用modelは必須ですか?
必須ではありません。公式の例示でも通常のmodelで動作します。境界の整合や大きな差し替えで破綻が続くときに、専用modelとInpaintModelConditioningの組み合わせを試す順で十分です。
まとめ
inpaintingはimg2imgと同じ「やり直す生成」で、マスクがやり直す場所を、denoiseがやり直す量を決めます。VAE Encode (for Inpainting)は元の内容を消して描き直す方式、Set Latent Noise Maskは元の形を残す方式なので、目的に合わせて先に選びます。境界が目立つときはマスク端・文脈不足・色差の順に一変数ずつ切り分け、元画像・マスク・workflow JSON・seedを毎回セットで残してください。