2024-01-03

【ComfyUI基礎シリーズ#7】インペイント(マスク)基礎

StableDiffusionではinpaintと呼ばれ、画像の一部だけ書き換える機能がある。ComfyUIでコレを実現する方法。

Article Image

Inpaitとは

画像の一部だけ書き換えるというStable Diffusionの機能。

元絵 左下だけ書き換えて妖精を出す
森 妖精が入った

恐らくここを読んでいるユーザはこれぐらいは知っていそうなので最低限に留める

が、WebUIと違い特殊なノードの組み方が必要なので今回はこの方法を解説する。

画像処理の基本であるマスクの概念を使うのでインペイントと呼ばずマスクと呼ぶことも多く、この記事の中では基本同じものとして扱う。

ComfyUI上で手書きマスク

ComfyUI上でマスクを書いてしまう(恐らく)最も簡単な方法。上の画像もこれで作っている。

まずはLoad Imageを使って元絵を読んでおく。

元絵をLoad Imageしたノード

次にこのノードの右クリックメニューからOpen In MaskEditorを選択。

Open In MaskEditor 右クリックのメニュー

次の画面を使えばComfyUI上で黒塗りのペイントを行い、それをマスクとして扱うことができる。

Mask Editorの画面

決定すると塗った箇所は灰色になる。次は今回使ったマスク。

マスク画像

ノードのつなぎ方

次のようにつなぐ。

440000000202401021147

VAE Encodeはいつものノードだが、その後にSet Latent Noise Maskという特殊なノードをつなぐ。

  • latent > inpaint > Set Latent Noise Mask
  • 検索名:SetLatentNoiseMask

※ノード検索ウィンドウはなにもないところをダブルクリック

そこにLoad Imageから出ているmaskをつなぐ。

Set Latent Noise Maskから出たlatentピンはKSamplerへ繋いだら、ほかは通常の画像生成と同じなのであとは生成するだけ。

KSamplerと繋いだ例

白黒の画像を読み込んでマスクとしてつかう

webUIでは白黒の画像を読み込んで「白で塗った部分を書き換える」という動作が可能。

ComfyUIで同じ動作を実現するにはLoad Image (as Mask)というノードを読み込んで白黒のマスク画像をセットする(アルファチャンネル必要なし)

  • mask > Load Image (as Mask)
  • 検索名:LoadImageMask

ノードの組み方例

こんな感じでバラ型の白黒画像を用意した。

こちらは先程のmaskに繋いでいたピンを繋ぎ変えるだけでOK

重要:チャンネル設定

アルファチャンネルがない場合(透過部分がない画像)の場合はchannelred,blue,greanのどれかに設定する必要がある(白黒画像の場合どれでも良い)

19100000020240102288

ここをalphaにしてしまうとマスクがの効果が無くなってしまう。

マスク画像 マスク適用後の森の画像
バラマスク マスクを使った森

アルファチャンネルを使う場合

アルファチャンネルを使う場合はマスク画像自体が透過pngである必要がある。

したがって画像編集ソフトなどで次のような画像を用意して使う

透過pngのバラ

※チェック模様は透過部分

red,blue,greenは何?

Load Image (as Mask)channelを使うことで3種類(r,g,b)のマスクを1枚の画像に格納することができる。

3色のマスク

このような画像を用意するとredでバラの左上だけ、greenで中央側だけ、blueで右側だけと3セット別々のマスクを1枚の画像から取り出すことができる。

が、この方法はよほど複雑な例をスマートに作りたい場合にしか使わないと思う。参考程度まで。

プロンプトにマスクを適用(中級)

更に一歩進んで、プロンプトが効果を及ぼす範囲をマスクで指定できる。

例えば、次のようなマスクを用意して

02000000020240103222

左上だけに「oni」右下だけに「fairy」のプロンプトを適用できる。

上で紹介したノードに加えて新しいノードを掲載する。

先に完成系

先に完成したノードの組み方を画像で掲載(一部)

完成版

注意点

  • Clip Text Encodeが3つになるが、左側は全てLoad CheckpointCLIPと接続することを忘れずに
  • Load Image (as Mask)のチャンネル設定に注意。ここでは白黒マスクなのでred,green,blueどれでもよい

InvertMaskノード

マスクを反転するノード

InvertMask外観

  • mask > InvertMask
  • 検索名:InvertMask

Conditioning (Set Mask)ノード

Conditioning (Set Mask)ノード外観

  • conditioning > Conditioning (Set Mask)
  • 検索名:ConditioningSetMask

ここにマスクを入力することによって、マスク部分にだけプロンプトを入れられる。

今回は上のノードでマスクを反転させることによって2つのプロンプトが重ならないよう場所分けしている。

Conditioning (Combine)ノード

Conditioning (Combine)ノード外観

  • conditioning > Conditioning (Combine)
  • 検索名:ConditioningCombine

Conditioning (Set Mask)ノードを使って2つに場所分けしたしたConditioningをこちらで一つにまとめてからKSamplerに入れる必要がある。

マスクでエリア分けしたのが混ざってしまわないか?と不安になるかもしれないが、これは大丈夫。

生成された画像

実際に生成されたサンプル画像が次

サンプル

右下になっている羽や胴体はフェアリーだが、左上の顔や背景には鬼が現れている。

その他:いろいろなノードにマスク入力がある

ここでは上げきれないが、様々なカスタムノードにマスク入力がある

ipadapterのマスク入力

ここでの基本を抑えておけばあらゆるノードでマスクのを使うことが出来ると思う。

最後に

マスクに関してはComfyUI上のノードからマスク画像を生成するSolidMaskなどのノードや、顔を認識してマスクを抽出するものなどまだ他にもある。

こちらは応用編となるので別途記事がかけたらと思う。



この記事をシェア


謎の技術研究部 (謎技研)