广告位 · 页头(后台-模块管理-新建模块后替换此区域)

如何用黑白遮罩精确控制ControlNet影响区域?

ControlNet的遮罩输入并不像图层蒙版那样只做二值裁剪。每一个像素的灰度值都参与控制信号调制:灰度255表示该位置完全接受ControlNet约束,灰度0表示完全忽略,中间值则按比例缩放控制强度。因此,想要让局部重绘、姿态控制或者线稿约束只作用于特定区域,关键不在于简单地把区域涂白,而在于遮罩边缘是否平滑、灰度层次是否合理,以及ControlNet自身的控制模式是否允许遮罩参与权重分配。

如何用黑白遮罩精确控制ControlNet影响区域?

在Stable Diffusion WebUI的ControlNet扩展中,每个控制单元除了可以上传控制图之外,还提供独立的mask通道。这个mask会在ControlNet内部被缩放、归一化,然后与控制信号逐像素相乘。理解这一点之后,许多生成问题就可以从遮罩层面找到原因。

灰度值如何决定控制强度

黑白遮罩的核心是灰度调制。通常约定白色为255,黑色为0。将遮罩数值归一化到0至1后,白色区域系数为1,表示ControlNet注入的特征在该位置完整保留;黑色区域系数为0,表示该位置的控制特征被清零;灰色像素则按比例缩放。比如灰度128对应约0.5,意味着控制强度减半。这种逐像素衰减比直接在图层蒙版上做二值选择要自然得多,也是局部控制能否成功的关键。

实际推理时,ControlNet的输出会与这个灰度系数相乘,再与U-Net主路径特征相加或相乘,具体取决于版本与实现。对用户而言,最直观的体会是:如果遮罩边缘是一条锐利的黑白分界线,控制信号也会突然中断,生成结果容易出现边缘接缝、局部贴图感甚至颜色溢出。相反,带有羽化过渡的遮罩能让控制信号平滑衰减,使生成区域与未控制区域自然融合。

需要注意的是,不同预处理器生成的控制图内容差异很大。线稿、深度、法线、姿态信号对边缘敏感度不同。例如深度图在羽化过渡区域如果衰减过快,背景与主体的空间关系可能错乱;姿态信号在关节处衰减过快,则会出现肢体不连贯。因此遮罩灰度并不只是软硬开关,还需要结合控制图类型选择合适的过渡宽度。

制作高质量黑白遮罩的三种实用方法

第一种是在图像编辑软件中手动绘制。以Photoshop或Krita为例,先用套索或钢笔圈出需要控制的范围,不要直接填充纯白,而是使用羽化选区功能,羽化半径根据图像分辨率设置在8到32像素之间。对于512像素宽的图,8至12像素通常足够;对于768像素或更大的图,可以增加到24至32像素。羽化后再填充白色,就能得到边缘平滑的遮罩。

第二种是用Python脚本批量生成遮罩。Pillow的高斯模糊可以精确控制羽化半径,而且适合需要大量遮罩或动态调整的场景。下面这段代码会在黑色画布上绘制一个白色矩形,再以指定半径进行高斯模糊,最终保存为ControlNet可读取的遮罩图。

from PIL import Image, ImageDraw, ImageFilter
def make_feathered_mask(size, box, blur_radius):
    mask = Image.new('L', size, 0)
    draw = ImageDraw.Draw(mask)
    draw.rectangle(box, fill=255)
    mask = mask.filter(ImageFilter.GaussianBlur(blur_radius))
    return mask
mask = make_feathered_mask((768, 512), (180, 120, 588, 392), 24)
mask.save('controlnet_mask.png')

第三种是使用ImageMagick命令行,适合不想写Python但需要快速出图的用户。命令同样生成黑色背景、白色矩形,并进行模糊处理。模糊参数0x24表示在水平与垂直方向上做24像素半径的高斯模糊,数值可以根据实际需要调整。

convert -size 768x512 xc:black -fill white -draw 'rectangle 180,120 588,392' -blur 0x24 controlnet_mask.png

无论使用哪种方法,生成后的遮罩最好在图像查看器中放大检查边缘。如果出现明显的锯齿或纯黑纯白跳变,说明羽化不足。若灰色过渡带过宽,控制区域会变得不明显,可以适当减小羽化半径或对遮罩做一次色阶压缩,把中间灰向黑白两端推动。

ControlNet参数与遮罩的联动调优

遮罩上传到ControlNet单元后,还需要与几个关键参数配合。权重weight直接决定整体控制强度。当存在遮罩时,权重仍然全局生效,但遮罩会在局部进一步衰减。通常建议从0.8开始测试,如果发现受控区域风格过于僵硬,可以降到0.6;如果控制不足,再逐步提高到1.0或1.2。不要一上来就拉满,否则羽化边缘附近的过渡会变得非常突兀。

控制模式control mode也值得关注。在Balanced模式下,ControlNet会平衡提示词与条件控制,适合大多数局部控制任务。在My prompt is more important模式下,生成结果会更偏向提示词,遮罩边缘的约束可能变弱,适合主体与背景需要更自由发挥的场景。而在ControlNet is more important模式下,即使遮罩灰度较低,条件控制也可能被强调,局部过拟合风险会增加。

尺寸处理resize mode同样不能忽视。如果遮罩尺寸与生成图不一致,建议使用Resize and Fill或直接保持原图尺寸,避免拉伸导致遮罩位置偏移。若使用Just Resize,非等比缩放会让白色区域变形,原本精细的局部控制会变成错误区域。最稳妥的做法是让控制图和遮罩都严格使用同一分辨率。

当使用多个ControlNet单元时,每个单元可以挂载不同的遮罩。比如一个单元控制人物姿态,遮罩只覆盖人物;另一个单元控制背景深度,遮罩覆盖背景。这样能避免多个条件信号互相干扰,实现多区域差异化控制。

常见翻车现象与排查思路

局部控制边缘出现明显接缝或色差,几乎都是遮罩边缘过硬造成的。解决方法是重新制作遮罩,给边缘增加8至16像素羽化。如果已经在图像编辑软件中羽化过,但生成结果仍然割裂,可以检查ControlNet的预处理分辨率是否过低。低分辨率控制图上再叠加灰度过窄的遮罩,两者插值误差会放大边缘问题。

遮罩完全不生效时,先确认遮罩是否上传到正确的ControlNet单元。ControlNet的mask通道与图生图中的inpaint mask不是同一个入口,两者不能混用。还要查看控制图预览是否正常。如果预处理器没有生成有效控制图,即便遮罩再准确也不会有结果。部分预处理器对输入图像亮度敏感,可以尝试换用其他预处理器或手动上传控制图。

如果控制区域与预期相反,可能是遮罩黑白颠倒。大部分实现遵循白控黑不控的约定,但某些工作流或第三方脚本有自定义处理,此时可以点击遮罩通道旁边的反转按钮,或者直接对遮罩图做反相。另一个容易被忽略的问题是,灰色过渡带太宽会让控制区域变得不明确,看上去好像哪里都有一点控制,但哪里都不够。此时应压缩灰度范围,把遮罩调整为更接近黑白分明的状态,只保留少量过渡。

广告位 · 文章底部(后台-模块管理替换此区域)