ComfyUI.Tokyo

SD15_Canny_Inpaint 疑似インペイント

inpaint の実現は主に三つの方法があります。

inpaint手法 役割
VAE Encode (for inpainting) マスク付き画像を latent space に変換
SetLatentNoiseMask マスク領域にノイズを注入し、再生成対象を明示
InpaintModelConditioning マスク情報と元画像の文脈を使って、生成内容を制御

さて、この三手法を用いないでinpaintを考えます。

ControlNetでは、インペイントはできないだろうか?

なぜ ControlNet Inpaint は難しいのか?

  • 問題①:ControlNetは「参照画像として画像を渡す」だけ
    control_v11p_sd15_inpaint.pth は、単に「マスクで強調された画像」を渡すことで「これを参考にして」というヒントを与えるに過ぎません。
    つまり、ControlNetには「ここだけ塗り替えろ」などという意志はないのです。
  • 問題②:KSampler はマスクを理解しない
    InpaintModelConditioning で latent を生成すれば、KSampler に「マスク範囲だけを再生成せよ」という命令が内部的に埋め込まれます。
    しかし、ControlNetにマスクを渡しただけでは、KSamplerは全体を生成してしまうため、「部分補完」にならない。

結論:ControlNetだけでは「厳密なinpaint」は不可能

ControlNetは「補助ヒント」にはなっても、「inpaint処理そのもの」にはなりません。

「Inpaintingの本質はLatent空間でのマスク制御にある」 という原理的な真実は明らです。

ControlNetやIPAdapterは「特定のユースケース(スタイル転写/幾何学制約)」には有用ですが、汎用的なInpaintingではInpaintModelConditioningが圧倒的です。

てなわけで、厄介、かつ、無駄な挑戦をします。

本作戦の核心

「Canny Edgeのマスク領域を意図的に欠損させ、ControlNetに修復を暗示させる」という発想です。

具体的には、元画像からCanny Edgeを抽出後、マスク領域に該当する部分の輪郭線を意図的に削除します。

ControlNetに加工済みCannyを入力し、通常のtxt2imgプロセスで、加工したCanny MapをControlNetに適用させてプロンプトで修復内容を指示(例:"a clean wall, seamless texture"等)します。

なぜこれが「擬似inpainting」と言えるか?

  • ControlNetの特性:
    「入力画像の幾何学的特徴を強く継承する」性質を逆手に取り、輪郭の欠損部分を「生成すべき空白」と解釈させる
  • Latent空間の操作不要:
    あくまでCanny Mapの改変だけで暗示をかける

workflow

SD15_Canny_Inpaint.json

この手法のいい点は、特定の検出nodeに依存していないところです。

Canny Hole Filling

Canny Hole Filling は、Stable Diffusionの拡張機能「ControlNet v1.1」の中で、Cannyエッジ検出を活用した画像生成技術の一種です。

特に「隠し機能的な使い方」として注目されているのは、線画の欠損部分(穴)を補完しながら高品質な画像を生成するという応用です。

Canny Hole Fillingとは?

「Canny Hole Filling」という名称は公式な機能名ではなく、ユーザーコミュニティで使われている非公式な呼び方です。

以下のような使い方が含まれます:

  • Cannyエッジ検出で抽出された線画に「穴」や「欠損」がある場合、それを補完するように画像を生成
  • 元画像の構図や輪郭を保ちつつ、プロンプトで補完的な情報を与えることで、欠損部分を自然に埋める
  • 線画のみに頼らず、色や質感の情報をプロンプトで補強することで、より完成度の高い画像が得られる

ControlNet Cannyの基本的な使い方

以下の手順で「Canny Hole Filling」的な使い方が可能です:

  1. 元画像を読み込む(線画抽出したい画像)
  2. ControlNetの設定で以下を選択:
    • 「Enable」にチェック
    • 「Pixel Perfect」「Allow Preview」にチェック
    • 「Preprocessor」に `canny`
    • 「Model」に `control_v11p_sd15_canny_fp16.safetensors`
  3. プロンプトで補完情報を入力
    • 例:`(brown skin, tanned skin:2), 1girl, classroom, school uniform`
  4. 画像生成を実行

この方法で、線画に欠損があっても、プロンプトの情報を元に自然な補完が行われます。

応用例

元画像 処理内容 結果
線画(顔の一部が欠けている) Canny + 補完プロンプト 顔の輪郭が自然に復元された高品質なイラスト
実写画像 Canny + イラスト系モデル 線画抽出 → イラスト化
イラスト画像 Canny + 実写系モデル 線画抽出 → 実写化

なぜ「隠し機能」なのか?

  • ControlNetの公式UIでは「穴埋め」機能として明示されていない
  • しかし、プロンプトとCannyの組み合わせで自然な補完が可能
  • 一部のユーザーがこの挙動を「Canny Hole Filling」と呼び、創造的な使い方として広めている









Link