このシリーズの記事一覧 (クリックで開閉)
【 ComfyUI基礎シリーズ 】
画像の一部だけ書き換えるというStable Diffusionの機能。
| 元絵 | 左下だけ書き換えて妖精を出す |
|---|---|
|
|
恐らくここを読んでいるユーザはこれぐらいは知っていそうなので最低限に留める
が、WebUIと違い特殊なノードの組み方が必要なので今回はこの方法を解説する。
画像処理の基本であるマスクの概念を使うのでインペイントと呼ばずマスクと呼ぶことも多く、この記事の中では基本同じものとして扱う。
ComfyUI上でマスクを書いてしまう(恐らく)最も簡単な方法。上の画像もこれで作っている。
まずはLoad Imageを使って元絵を読んでおく。
次にこのノードの右クリックメニューからOpen In MaskEditorを選択。
次の画面を使えばComfyUI上で黒塗りのペイントを行い、それをマスクとして扱うことができる。
決定すると塗った箇所は灰色になる。次は今回使ったマスク。
次のようにつなぐ。
VAE Encodeはいつものノードだが、その後にSet Latent Noise Maskという特殊なノードをつなぐ。
※ノード検索ウィンドウはなにもないところをダブルクリック
そこにLoad Imageから出ているmaskをつなぐ。
Set Latent Noise Maskから出たlatentピンはKSamplerへ繋いだら、ほかは通常の画像生成と同じなのであとは生成するだけ。
webUIでは白黒の画像を読み込んで「白で塗った部分を書き換える」という動作が可能。
ComfyUIで同じ動作を実現するにはLoad Image (as Mask)というノードを読み込んで白黒のマスク画像をセットする(アルファチャンネル必要なし)
こんな感じでバラ型の白黒画像を用意した。
こちらは先程のmaskに繋いでいたピンを繋ぎ変えるだけでOK
アルファチャンネルがない場合(透過部分がない画像)の場合はchannelをred,blue,greanのどれかに設定する必要がある(白黒画像の場合どれでも良い)
ここをalphaにしてしまうとマスクがの効果が無くなってしまう。
| マスク画像 | マスク適用後の森の画像 |
|---|---|
|
|
アルファチャンネルを使う場合はマスク画像自体が透過pngである必要がある。
したがって画像編集ソフトなどで次のような画像を用意して使う
※チェック模様は透過部分
Load Image (as Mask)のchannelを使うことで3種類(r,g,b)のマスクを1枚の画像に格納することができる。
このような画像を用意するとredでバラの左上だけ、greenで中央側だけ、blueで右側だけと3セット別々のマスクを1枚の画像から取り出すことができる。
が、この方法はよほど複雑な例をスマートに作りたい場合にしか使わないと思う。参考程度まで。
更に一歩進んで、プロンプトが効果を及ぼす範囲をマスクで指定できる。
例えば、次のようなマスクを用意して
左上だけに「oni」右下だけに「fairy」のプロンプトを適用できる。
上で紹介したノードに加えて新しいノードを掲載する。
先に完成したノードの組み方を画像で掲載(一部)
注意点
Clip Text Encodeが3つになるが、左側は全てLoad CheckpointのCLIPと接続することを忘れずにLoad Image (as Mask)のチャンネル設定に注意。ここでは白黒マスクなのでred,green,blueどれでもよいマスクを反転するノード
ここにマスクを入力することによって、マスク部分にだけプロンプトを入れられる。
今回は上のノードでマスクを反転させることによって2つのプロンプトが重ならないよう場所分けしている。
Conditioning (Set Mask)ノードを使って2つに場所分けしたしたConditioningをこちらで一つにまとめてからKSamplerに入れる必要がある。
マスクでエリア分けしたのが混ざってしまわないか?と不安になるかもしれないが、これは大丈夫。
実際に生成されたサンプル画像が次
右下になっている羽や胴体はフェアリーだが、左上の顔や背景には鬼が現れている。
ここでは上げきれないが、様々なカスタムノードにマスク入力がある
ここでの基本を抑えておけばあらゆるノードでマスクのを使うことが出来ると思う。
マスクに関してはComfyUI上のノードからマスク画像を生成するSolidMaskなどのノードや、顔を認識してマスクを抽出するものなどまだ他にもある。
こちらは応用編となるので別途記事がかけたらと思う。
