2024-02-21

【KJNodes #2】KJNodesでマスクを操作するノード【ComfyUI】

第一回ではマスクを「生成」する方法を上げたが、こちらではそれらを活用するための他ノードを紹介する。

Article Image

第二回概要

ComfyUIにてマスク関係に強いKJNodesを解説する記事第二回

第一回では主にマスクを作成するgenerate系を紹介した。

今回はmaskingの項目の中にあるノード全体を見ていく(generateは除外)

324000000202402175247

マスクごとにプロンプトを変えるノード

KJNodes > masking > conditioningConditioningSetMaskAndCombineノード

mask1枚目にはAプロンプト、mask2枚目にはBプロンプト、といったようにプロンプトを部分で分けるノード。

ConditioningSetMaskAndCombine外観

このノードは接尾辞に数字がついたものが複数あるが、その数のプロンプトを合成するという意味で基本はすべて同じ。

次のように組むと

マスクで分けるノードの組み方

次のように左右で景色を分けるなどということが可能

左右で雪と花びらで別れている例

このノードを使わなくても標準のノードでも可能。次で解説。

【ComfyUI基礎シリーズ#7】インペイント(マスク)基礎 | 謎の技術研究部

同じカテゴリにConditioning Multi Combineというノードがあり、以前はconditionの入力ピン数を自由に設定できるノードだったようだが、現在では数値を上下してもピンが変化しない。

しかもなぜかマイクによる音声入力がついているという謎ノードになっている。

詳細不明なため解説しない。怖い。

マスクの範囲を広げる

GrowMaskWithBlur

マスクのフチを外に押し出すように拡大する。Davinci ResolveではErodeノードに相当するもの。

GrowMaskWithBlur外観

押し出した例

左のマスクをGrowMaskWithBlurで外側に広げたものが右側。

簡易設定解説

  • Expand: 外側に広げる範囲
  • incremental_expandrate: 不明
  • tapered_corners: 角になっている部分が鋭角になる?試してみたほうが良い
  • flip_input: マスク反転。invert maskをかけたのと同じ効果
  • blur_radius: 数値を上げるとマスクのフチをぼかしてくれる
  • lerp_alpha: 不明
  • -decay_factor: 不明

特定の色を抽出してマスクにする

ColorToMask

0~255の数値で特定のRGB値を指定して、そのカラーをマスクとして扱うノード

ColorToMaskサンプル

Photoshopでいうところの色域指定と同じように特定の1職を指定して、その色に近似している色をマスクとする。

おまけ:Convert Image to Maskとは違う

Convert Image To Maskノード

Convert Image To MaskはRGBのうち1チャンネルを選んでそれをマスクにするもの。

Convert Image To Maskの画像例

例えばこの場合はR値が1でも含まれていればマスクになる。

右下はR値が含まれないグリーン系の色なので黒になっている。

ちょっと混乱しがちだが全く違うマスクが出るので注意。

色の雰囲気を伝送するフィルタ

ColorMatch

ColorMatchノード例

※わかりやすくするためmask用にLoad Imageを2個配置しているが、厳密には1個で作れる

厳密に調べた訳では無いがmethodreinhardの論文(だと思われる)ものの冒頭を読む限り、とある画像の色情報を別の画像に伝えて同じような質感にするものだと思われる。

絵自体はimage_targetが出力されるが、色の質感はimage_refにいれたものになる。

これもmaskingに分類されているノードなので紹介しているが、直接マスクを操作するものではない。

マスクを使って画像を四角形にクロップ

BatchCropFromMask

BatchCropFromMaskのノード例

シンプルにmasksピンに入ったマスクで画像を切り取るもの。バッチ処理に対応。

ただし、正確にマスクで塗られているピクセルを切る取るわけではなく、マスクされている部分を囲む四角形(bbox)をクロップする仕組み。

この範囲を正確にコントロールする方法がいまいちわかってないがbbox_smooth_alphaは合成時に自然にフチを合成するためのアルファ分の余白になると思われる。

crop_size_multi = 2, bbox_smooth_alpha = 0.5にすると元のbboxと同じサイズが取れる。

恐らくbboxとは画像編集やCGでよく使われる用語のバウンディングボックス(bounding box)のこと。

Outputピン

  • original_images: 入力ピンに入ってきたものをそのままスルーしているだけのもの, 切り取る前の絵
  • cropped_images: マスクで切り取られた後の画像
  • bboxes: バウンディングボックスが入っている。座標のような数値データ。
  • width, height: それぞれのバウンディングボックスの縦横サイズ

Advanced版がある

BatchCropFromMaskAdvncedという類似ノードがある

BatchCropFromMaskAdvnced外観

combined系のピンが付いているが、詳しくは不明

クロップ画像を元の位置にはめて戻す

クロップした画像を更になんらかの処理をしてもとに戻すというケースは最も利用価値が高い例だと思う。

BatchUncropというノードと繋げることで可能。

BatchUncrop

ただ、これだと切り取って戻しただけなので意味無し。 なにか途中に加工を加えてみる。

ノード例

上で紹介したColorMatchを使って色が変化した元画像に、加工してない元画像の重ねた例。

これは元画像側に加工を施しているが、クロップした方に加工を施すことも考えられる。

BBOXが直接繋がっていれば、クロップイメージはサイズを変化させても元画像に戻る。

サイズが変わっても元に戻る

なので切り取って様々な加工を施してもとに戻すといった使い方が考えられる。

何も塗られてないマスクデータを除去する

FilterZeroMasksAndCorrespondingImages

FilterZeroMasksAndCorrespondingImagesノード例

まずmasksoriginal_imagesには同じ枚数の入力がある前提(マスクと画像が同じ枚数でセットになっていること)

ここで、マスクが真っ黒になっている(マスクの意味をなしてないデータ)があった場合、そのマスクとソレに対応した画像を除外するノード。

調べた限りこのノードを使っている実用例は見当たらなかった。マニアックなノード。

もう少し詳しく知りたい場合、twitterに使用例を書いてみたので興味あればぜひ

https://x.com/Neve1074/status/1759567522242986026?s=20

テキストで指定してマスクを生成する

BatchCLIPSeg

次のように画像とテキストを入力し、テキストに書かれているものをマスクで出力するノード

BatchCLIPSegを使った例

マスクの精度こそ大したことないが、たったこれだけのノードで対話するように物を指定するだけでマスクを切ってくれるすごいノード。

例の下部ではImageBlendノードを使ってマスクと元画像を合成してどこにマスクが書かれているかをわかりやすくしているだけ。

マスクを2値化する

RoundMask

RoundMaskを使った例

マスクを2値化するノード。

Roundなので恐らく四捨五入の計算だと思われる。

マスクのサイズを絶対値で変更する

ResizeMask

ResizeMaskノード

絶対値でマスクサイズを変更するノード。

変換後のwidthheightも取れるようだが、何に使うのだろうか。

keep_proportionsを使うと縦横比を維持したまま変換できそうに思うがこの記事執筆時点でこれをオンにするとエラーが出るため使用できなかった。

マスクをズラしたり回転したりする

OffsetMask

OffsetMaskを使った例

  • x,y: それぞれの軸で移動する。ピクセル単位?
  • angle: 回転することができる。恐らく内部的には中央で回転させたあと移動する順番
  • duplication_factor: この数値のバッチマスクにしてくれる
  • roll: 不明
  • incremental: duplication_factorがオンの場合、angleで回転した画像を更に次のバッチで回転していく
  • padding_mode: 不明。borderにすると、中央からズレてもまた中央に戻る??

incrementalの例

incrementalの例

BBOXのデータをINT値で分解する

BboxToInt

BboxToInt外観

BBOX内のデータを取り出したい時や演算して戻すなどの特殊な処理で使うと思う。

これを使うケースの多くは上で解説したBatchCropFromMaskと併用する場合ではないだろうか。

例えば演算して戻す場合

演算

このようにBBoxを意図的にズラす、拡大するなどの処理になるのでよほど上級でなければ使わないと思う。

が、一番有り得そうなのがこういった使い方なので覚えておいて損はない。

不明:BBOXの配列を分裂させる??

SplitBboxes

SplitBboxes

こちら全く使ったことも見かけたこともないので詳細不明。

不明:ComfyUI内で音を使う関連?

OffsetMaskByNormalizedAmplitude

こちらのノードは恐らく次のカスタムノードと組み合わせて使う用

a1lazydog/ComfyUI-AudioScheduler

オーディオの波形に応じてマスクを変形するものだろうか?

海外のフォーラムで一つだけ例をみかけたが、Comfy内でオーディオを扱うことに私自身あまり興味がないためこれ以上調べていない。

さいごに

マスクの処理に関しては結構色々なノードがあった。

中でもBatchCropFromMaskは何かとよく使うことになりそうな予感がある。

別ソフトになるがCGのマテリアルを作る専門のソフトAdobeのSubstance Designerなどではもっとたくさんのマスク処理系のノードがある。

マスクを制するものは画像を制すると言っても過言ではないのでこの手のノードは後々役に立ってくることは間違いないと思う。



この記事をシェア


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