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
この手法のいい点は、特定の検出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」的な使い方が可能です:
- 元画像を読み込む(線画抽出したい画像)
- ControlNetの設定で以下を選択:
- 「Enable」にチェック
- 「Pixel Perfect」「Allow Preview」にチェック
- 「Preprocessor」に `canny`
- 「Model」に `control_v11p_sd15_canny_fp16.safetensors`
- プロンプトで補完情報を入力
- 例:`(brown skin, tanned skin:2), 1girl, classroom, school uniform`
- 画像生成を実行
この方法で、線画に欠損があっても、プロンプトの情報を元に自然な補完が行われます。
応用例
| 元画像 | 処理内容 | 結果 |
|---|---|---|
| 線画(顔の一部が欠けている) | Canny + 補完プロンプト | 顔の輪郭が自然に復元された高品質なイラスト |
| 実写画像 | Canny + イラスト系モデル | 線画抽出 → イラスト化 |
| イラスト画像 | Canny + 実写系モデル | 線画抽出 → 実写化 |
なぜ「隠し機能」なのか?
- ControlNetの公式UIでは「穴埋め」機能として明示されていない
- しかし、プロンプトとCannyの組み合わせで自然な補完が可能
- 一部のユーザーがこの挙動を「Canny Hole Filling」と呼び、創造的な使い方として広めている









