ComfyUIにてマスク関係に強いKJNodesを解説する記事第二回
第一回では主にマスクを作成するgenerate系を紹介した。
今回はmaskingの項目の中にあるノード全体を見ていく(generateは除外)
KJNodes > masking > conditioning
のConditioningSetMaskAndCombine
ノード
mask1枚目にはAプロンプト、mask2枚目にはBプロンプト、といったようにプロンプトを部分で分けるノード。
このノードは接尾辞に数字がついたものが複数あるが、その数のプロンプトを合成するという意味で基本はすべて同じ。
次のように組むと
次のように左右で景色を分けるなどということが可能
このノードを使わなくても標準のノードでも可能。次で解説。
同じカテゴリにConditioning Multi Combine
というノードがあり、以前はconditionの入力ピン数を自由に設定できるノードだったようだが、現在では数値を上下してもピンが変化しない。
しかもなぜかマイクによる音声入力がついているという謎ノードになっている。
詳細不明なため解説しない。怖い。
GrowMaskWithBlur
マスクのフチを外に押し出すように拡大する。Davinci ResolveではErode
ノードに相当するもの。
左のマスクをGrowMaskWithBlur
で外側に広げたものが右側。
invert mask
をかけたのと同じ効果ColorToMask
0~255の数値で特定のRGB値を指定して、そのカラーをマスクとして扱うノード
Photoshopでいうところの色域指定
と同じように特定の1職を指定して、その色に近似している色をマスクとする。
Convert Image To Mask
はRGBのうち1チャンネルを選んでそれをマスクにするもの。
例えばこの場合はR値が1でも含まれていればマスクになる。
右下はR値が含まれないグリーン系の色なので黒になっている。
ちょっと混乱しがちだが全く違うマスクが出るので注意。
ColorMatch
※わかりやすくするためmask用にLoad Imageを2個配置しているが、厳密には1個で作れる
厳密に調べた訳では無いがmethod
のreinhard
の論文(だと思われる)ものの冒頭を読む限り、とある画像の色情報を別の画像に伝えて同じような質感にするものだと思われる。
絵自体はimage_target
が出力されるが、色の質感はimage_ref
にいれたものになる。
これもmasking
に分類されているノードなので紹介しているが、直接マスクを操作するものではない。
BatchCropFromMask
シンプルにmasks
ピンに入ったマスクで画像を切り取るもの。バッチ処理に対応。
ただし、正確にマスクで塗られているピクセルを切る取るわけではなく、マスクされている部分を囲む四角形(bbox)をクロップする仕組み。
この範囲を正確にコントロールする方法がいまいちわかってないがbbox_smooth_alpha
は合成時に自然にフチを合成するためのアルファ分の余白になると思われる。
crop_size_multi = 2
, bbox_smooth_alpha = 0.5
にすると元のbboxと同じサイズが取れる。
恐らくbboxとは画像編集やCGでよく使われる用語のバウンディングボックス(bounding box)のこと。
クロップした画像を更になんらかの処理をしてもとに戻すというケースは最も利用価値が高い例だと思う。
BatchUncrop
というノードと繋げることで可能。
ただ、これだと切り取って戻しただけなので意味無し。 なにか途中に加工を加えてみる。
上で紹介したColorMatch
を使って色が変化した元画像に、加工してない元画像の重ねた例。
これは元画像側に加工を施しているが、クロップした方に加工を施すことも考えられる。
BBOXが直接繋がっていれば、クロップイメージはサイズを変化させても元画像に戻る。
なので切り取って様々な加工を施してもとに戻すといった使い方が考えられる。
FilterZeroMasksAndCorrespondingImages
まずmasks
とoriginal_images
には同じ枚数の入力がある前提(マスクと画像が同じ枚数でセットになっていること)
ここで、マスクが真っ黒になっている(マスクの意味をなしてないデータ)があった場合、そのマスクとソレに対応した画像を除外するノード。
調べた限りこのノードを使っている実用例は見当たらなかった。マニアックなノード。
もう少し詳しく知りたい場合、twitterに使用例を書いてみたので興味あればぜひ
BatchCLIPSeg
次のように画像とテキストを入力し、テキストに書かれているものをマスクで出力するノード
マスクの精度こそ大したことないが、たったこれだけのノードで対話するように物を指定するだけでマスクを切ってくれるすごいノード。
例の下部ではImageBlend
ノードを使ってマスクと元画像を合成してどこにマスクが書かれているかをわかりやすくしているだけ。
RoundMask
マスクを2値化するノード。
Roundなので恐らく四捨五入の計算だと思われる。
ResizeMask
絶対値でマスクサイズを変更するノード。
変換後のwidth
とheight
も取れるようだが、何に使うのだろうか。
keep_proportions
を使うと縦横比を維持したまま変換できそうに思うがこの記事執筆時点でこれをオンにするとエラーが出るため使用できなかった。
OffsetMask
BboxToInt
BBOX内のデータを取り出したい時や演算して戻すなどの特殊な処理で使うと思う。
これを使うケースの多くは上で解説したBatchCropFromMask
と併用する場合ではないだろうか。
例えば演算して戻す場合
このようにBBoxを意図的にズラす、拡大するなどの処理になるのでよほど上級でなければ使わないと思う。
が、一番有り得そうなのがこういった使い方なので覚えておいて損はない。
SplitBboxes
こちら全く使ったことも見かけたこともないので詳細不明。
OffsetMaskByNormalizedAmplitude
こちらのノードは恐らく次のカスタムノードと組み合わせて使う用
a1lazydog/ComfyUI-AudioScheduler
オーディオの波形に応じてマスクを変形するものだろうか?
海外のフォーラムで一つだけ例をみかけたが、Comfy内でオーディオを扱うことに私自身あまり興味がないためこれ以上調べていない。
マスクの処理に関しては結構色々なノードがあった。
中でもBatchCropFromMask
は何かとよく使うことになりそうな予感がある。
別ソフトになるがCGのマテリアルを作る専門のソフトAdobeのSubstance Designerなどではもっとたくさんのマスク処理系のノードがある。
マスクを制するものは画像を制すると言っても過言ではないのでこの手のノードは後々役に立ってくることは間違いないと思う。