画像を比べる

クリエイティブ実践ガイド

ComfyUIのインペイント失敗例で学ぶ|マスクの範囲と元画像への合成

ComfyUIのインペイントで画像の一部だけを直す方法
目次

家の雰囲気は好きだけど、窓だけ青い丸窓にしたい。こんな部分修正には、変えたい場所を塗って描き直すインペイントが使えます。ただ、塗る範囲を広げると、残したかった屋根まで描き直しの対象になります。

かがり

窓だけ直したいのに屋根まで変わったら、どこをやり直せばいいのよぉ!

ロコ

まず塗った範囲を見よう。残す屋根と描き直す窓を分けて確かめるんだよ。

今回は、青い丸窓を狙ってうまくいかなかった二枚と、その後にマスクを狭めて試した比較を使います。元画像と設定を開き、マスクを塗って生成するところから、結果を見て次に直す箇所を決めるところまで進めましょう。マスクの外側を元画像のまま残す合成方法も説明します。

1. 元画像と、インペイント用の設定を開く

通常のSDXL Baseで一枚生成できる状態から始めます。まず、次の画像とJSONをPCへ保存してください。JSONには、画像とマスクを渡して描き直すための接続が入っています。

ComfyUIで Ctrl+Oを押し、保存したJSONを開きます。「チェックポイントを読み込む」でsd_xl_base_1.0.safetensorsを選んだら、「画像を読み込む」(Load Image)へ家のPNGをアップロードしましょう。家のプレビューが表示されたら、次はその上に変更範囲を描きます。

画像全体を描き直すimg2imgと違い、この設定では VAE Encode(for Inpainting)へ画像とマスクの両方を渡します。KSamplerで生成したあと、編集部分を元画像へ合成して保存するところまで接続してあります。

2. 窓と、その周りの必要な範囲を塗る

Load Imageの家を右クリックし、Open in MaskEditorを選びます。開いた画面で、家の上部の窓をブラシで塗ります。ここで塗る場所が、描き直す対象です。塗り終えたら右上の 保存を押してください。

マスクエディターで家の上部の窓を塗った画面。黒い半透明の範囲が窓の周囲や屋根の一部まで広がっている
実例で塗った範囲。窓だけでなく、周囲の壁や屋根の一部も含まれています。画面はComfyUI 0.41.0、フロントエンド1.55.17です。 画像を拡大して見る

窓の形を丸く変えるには、元の窓だけでなく、新しい丸窓が収まる周囲も必要です。ただ、屋根まで広く塗ると、そこも変更してよいと渡すことになります。保存前に画像を見直し、残したい屋根へはみ出した分は消しゴムで直しましょう。掲載例のマスクは屋根の一部を含んでおり、後で結果を読む手がかりになります。

掲載例と同じマスクで試す場合は、マスク付きPNGをLoad Imageへ読み込めます。

黒く塗って見えるのに、白が編集範囲なの?

マスクエディターでは、塗った部分に黒い半透明の表示が重なります。一方、処理に渡す白黒マスクでは 白が描き直す範囲、黒が残す範囲です。同じ黒でも、画面の重ね表示とマスクの値では意味が違います。

Load Imageの緑色の MASK出力を、VAE Encode(for Inpainting)のmaskへつなぎます。サンプルJSONでは、この接続も済んでいます。

自分で用意した白黒画像を使う場合は、Convert Image to Maskへその画像をつなぎ、channelにredを選びます。不透明な白黒PNGをLoad Imageで開いただけでは、絵の白黒がそのままMASK出力になるわけではないためです。

3. 描きたい窓を文章で指定して、一枚作る

マスクで伝えられるのは、変更してよい場所です。そこへ何を描くかは、プロンプトで指定します。サンプルのポジティブ欄には、家の上部に青い丸いステンドグラスの窓がある景色を入れています。

a small wooden cabin beside a mountain lake, a single round blue stained glass window in the upper front gable, blue glass glowing softly, wooden walls, watercolor illustration, soft colors, no people

ネガティブはtext, watermark, blurryです。ポジティブに木の壁や水彩風の絵柄も含めているのは、元の家となじむ描かれ方にしたいためです。

KSamplerの ノイズ除去(denoise)を 0.65にして実行します。まずはこの一枚を保存し、窓の形と、その周囲を拡大して見てみましょう。

4. 狙った窓にならなかったら、マスクも見直す

0.65の出力は、窓の位置に灰青色の形ができました。しかし、狙った青い丸いステンドグラスにはなっていません。まず結果を見て、そのあと同じマスクでdenoiseを上げた一枚と比べましょう。

denoise 0.65の出力。家の上部の窓が灰青色の平たい楕円状になり、青い丸窓にはなっていない
0.65では、窓の位置に灰青色の形ができました。狙った青い丸窓にはなっていません。 画像を拡大して見る

次に、元画像とマスクをそのまま使い、denoiseだけを 1.0へ上げた結果を見てみます。最初の一枚は次の設定です。二枚目もdenoise以外は変えていません。

項目 今回の設定
モデル/画像サイズ SDXL Base 1.0/1024×1024
seed/生成後の制御 20261014/fixed
steps/CFG 30/7
sampler/scheduler dpmpp_2m/karras
VAE Encode(for Inpainting)のgrow_mask_by 6
最初に試すdenoise 0.65

grow_mask_byは、生成時に使うマスクを周囲へ広げる設定です。今回の二枚は、サンプルの6を共通にしています。

denoise 1.0の出力。家の上部の屋根や開口部の形が変わり、青い丸窓は描かれていない
1.0では、屋根や開口部の形も変わりました。denoiseを上げるだけでは、目的の窓にはなりませんでした。 画像を拡大して見る

1.0では屋根や開口部も変わり、欲しかった窓にはなりませんでした。描き直す強さを増やしても、塗った範囲や指示が目的に合っていなければ解決しない例です。

そこで次は、屋根の残したい部分をマスクから外し、窓の周囲へ範囲を絞って比べました。denoiseとプロンプトは共通にし、マスクを狭めたことで窓と屋根がどう変わるかを見ます。

マスクを狭めても、青い丸窓にはならなかった

10月23日には、上で残っていた「屋根を避けたら成功するか」も試しました。元の家へ戻り、窓を囲む範囲を27,790画素から7,377画素へ狭めています。Seed 20261014、30 Steps、CFG 7、DPM++ 2M・Karras、denoise 0.65、grow_mask_by=6とプロンプトは共通です。

かがり

屋根を塗らなければ、今度こそ窓だけ変わるわよね……?

ロコ

外側は残せたよ。でも青い丸窓にはならなかったんだ。残せた場所と、描けなかった物を分けて見てみよう。

10月23日に元の広いマスクで再生成した家の上部。窓と屋根を覆う灰青色の大きな楕円が出ている
同日の広いマスク。屋根を覆う灰青色の形が出て、丸いステンドグラスにはなりませんでした。家の上部300×300画素の切り出し。 画像を拡大して見る
狭いマスクで生成した家の上部。屋根の外形は残ったが、窓は白灰色の板のような形になり、青い丸窓ではない
狭いマスク。屋根の外形は残りましたが、窓の場所は白灰色の板のような形です。切り出し位置は上と同じ。 画像を拡大して見る

今回は両方とも、元のマスクで合成した後のマスク外の変更は0画素でした。一方、窓そのものはどちらも未達です。マスクを狭めることは残したい場所を守る助けになりますが、描きたい物が出る保証にはなりません。

使ったのは通常のsd_xl_base_1.0.safetensorsで、専用のインペイントモデルではありません。同じ検証版のComfyUI(commit 63be2f9b82ad0dac88a7ceaa28a9cf3154125a18)で広い・狭いを一回ずつ実行しました。以前の掲載時と実行版が違うため、上の10月17日の画像へ追加した「マスクだけの差」とはせず、今回の二枚を対にしています。一つのSeedでの失敗なので、原因をモデルやマスクだけへ断定はできません。

狭いマスク付きPNG、広いマスクの元出力、狭いマスクの元出力、実行条件と画素の比較を保存できます。

丸い形と青い色を詳しく指示しても、窓にはならなかった

2026年10月25日には、最初の広いマスクとdenoise 0.65を使い、プロンプトの窓の部分を「完全に円形のコバルトブルーのステンドグラス窓」「丸い木枠」と具体化して一枚だけ試しました。モデル・元画像・マスク・Seed・Stepsなどの入力はそのままです。

丸い木枠と青い窓を具体的に指示した出力。家の上部と屋根の一部が大きな灰青色の楕円状になり、窓枠は描かれていない
指示を具体化した一試行。灰青色の大きな板のような形が残り、狙った丸窓にはなりませんでした。 画像を拡大して見る

マスク外の1,020,786画素は、今回も元画像から変更0でした。それでも、窓の色や形を指定するだけでは目的の描画に届きませんでした。元PNG・変更した指示・マスク外の差分を残しています。過去の実行環境の全条件が同じとまでは確認していないため、プロンプトの効果をこの一枚で断定せず、未達の試行として扱います。専用のインペイントモデルへ替える比較は未実施です。

5. 残したい外側には、元画像の画素を使う

かがり

マスクの外が0画素の変更なら、窓の修正も成功したってこと?

ロコ

確かめられたのは外側を残せたことだよ。窓の色と丸い形は、生成した部分を別に見て判断しよう。

マスクで描き直す場所を指定しても、画像をVAEで変換して戻す過程で、外側に細かな差が出ることがあります。外側を元画像のまま使いたいなら、生成後に ImageCompositeMaskedで貼り戻します。サンプルJSONの末尾にある処理です。

ImageCompositeMaskedの入力 つなぐもの
destination Load Imageの元画像
source VAE Decodeで画像へ戻した生成結果
mask Load Imageの元のMASK出力

今回のように元画像と出力が同じ1024×1024なら、x=0、y=0、resize_source=falseで重ねます。合成後のIMAGEをSave Imageへつなぎます。

保存する線がVAE Decodeから直接Save Imageへ入っていたら、それは合成前の画像です。元画像の外側を使う今回の手順では、ImageCompositeMaskedの出力からSave Imageまでをたどってください。窓の描き直しを見る画像と、外側を貼り戻した画像を取り違えずに済みます。

合成すると、マスクの内側に生成画像、外側に元画像が使われます。10月17日のdenoise 0.65・1.0の二枚でも、合成後のマスク外は元画像と同じ画素値でした。窓の描き直し自体が成功するかとは別に、「外側を残す」ことを確かめられた結果です。

この「外側」は、元のマスクの値が0の場所です。掲載例のマスクの縁には中間の値もあり、そこでは元画像と生成画像が混ざります。VAE Encodeのgrow_mask_by=6で広げた範囲ではなく、合成ノードへ渡す元のMASKを基準に残す場所が決まるので、接続先を見比べてください。画素の比較記録には、二枚ともマスク外の変更が0画素だったことと、丸窓は未達だったことを残しています。

次に直すときのために、画像とマスクを一組で残す

出力だけを見ると、どこまで塗った結果かを忘れがちです。元画像、マスク、ワークフローJSONも一緒に保存しておきましょう。失敗した画像をさらに入力するのではなく、元の家へ戻って、変更する場所からやり直せます。

今回の狭いマスクは、屋根を残すところまで確かめられました。丸窓を描く条件はまだ見つかっていないので、ここを成功例としてまねるより、残したい外側を守る手順として使ってください。家全体を冬景色にしたい場合は、img2imgとdenoiseへ進めます。まず「何を変えて、何を残したいか」を一つ決めると、画像全体を描き直すのか、マスクで場所を選ぶのかも決めやすくなります。

まとめ

  • マスクで変えたい場所を塗り、プロンプトで変更後の内容を指定する
  • 青い丸窓を作る実例では、denoiseを上げるだけでは成功せず、屋根も変わった
  • マスク外を元画像のまま残す場合は、生成後にImageCompositeMaskedで合成する
公式

公式サイト

同じテーマから