想象你面前有一座微缩沙盘:小木屋、行道树、停在路边的自行车,全部被胶水粘在底盘上。你想让树叶轻轻摆动、屋顶的炊烟缓缓流动、自行车轮子转起来,但你不能端起整座沙盘摇晃。Motion Brush 就是 AI 视频工具里的一把魔法喷漆枪。你只需在画面某个区域喷上一笔,那个区域就像被解除了定身咒,开始按照你拖动画笔的方向运动;没喷到的地方仍然安安静静。喷得浓,动得多;喷得淡,动得少。方向、幅度、范围,全都由这一支笔刷控制。本文就用这把喷漆枪,带你从头到尾学会精准控制视频里的局部运动。

岗位关联

对 AI 视频创作者来说,学会 Motion Brush 等于从「整段视频随机动」升级到「想动哪里动哪里」,是做出专业级局部动效的核心技能。

目录
  1. 可视化演示
  2. 认识运动笔刷
  3. 区域选择技巧
  4. 运动方向控制
  5. 幅度与速度控制
  6. 参数精调方法
  7. 实战完整流程
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示Motion Brush笔刷区域选择、运动方向幅度控制及效果对比,揭示AI视频局部运动精确控制的核心机制。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Motion Brush笔刷区域控制 笔刷涂抹:在视频帧上绘制需要产生运动的区域 区域蒙版:笔刷轨迹生成精确的运动区域蒙版 运动方向:指定区域内像素的运动方向和幅度 Motion = BrushMask × Direction × Amplitude Motion Brush实现视频局部运动的精确控制

认识运动笔刷

把照片想象成沙盘,Motion Brush 就是一把魔法喷漆枪。你拿着喷枪在沙盘的小路上喷了一笔,之后模型生成时,才敢让小路附近的模型动起来。喷枪没有把物体抓走,只是给这块区域发了一张「运动许可证」。这种理解非常重要:它决定了你后续所有的操作,都是在划定「哪里能动」和「怎么动」,而不是直接搬运画面。

在技术层面,图生视频模型默认会给整张图生成运动,容易导致背景乱晃、主体漂移。Motion Brush 提供的是一张由你的笔画人工指定的空间遮罩。常见工具里的 motion brush、motion paint、局部运动笔刷,名称不同,核心逻辑却一致:先用遮罩框出局部,再为目标区域赋予运动信息。

运动笔刷生成的结果,可以看作一个逐像素的运动场。每个像素都被赋予一个位移向量;没被笔刷覆盖的地方,这个向量为 0,画面自然保持静止。用公式表达,就是原图加上「遮罩 × 方向 × 时间」的累积效果。

所以,拿喷漆枪之前,先认识一瓶漆的边界:它只负责「哪里能动、怎么动」,不会替你判断哪些内容该动。所有局部运动,都从这一笔开始。

Iout(p,t)=Iin(p)+M(p)⋅D⃗(p) t\displaystyle I_{\text{out}}(p,t) = I_{\text{in}}(p) + M(p)\cdot \vec{D}(p)\, t
这个公式想说:输出画面等于原始画面,加上由笔刷遮罩、运动方向和播放时间共同决定的偏移量。
  1. 输出像素I_out(p,t) 表示位置 p 在时刻 t 的最终像素颜色。
    Iout(p,t)I_{\text{out}}(p,t)
  2. 输入像素I_in(p) 是原图在位置 p 的像素,也就是运动开始前的底色。
    Iin(p)I_{\text{in}}(p)
  3. 笔刷遮罩M(p) 表示该像素是否被喷漆枪覆盖,覆盖取 1,未覆盖取 0。
    M(p)M(p)
  4. 运动方向D(p) 是每个被覆盖像素的位移向量,方向由你拖动画笔的路径决定。
    D⃗(p)\vec{D}(p)
  5. 时间累计t 是播放时间,随时间增大,位移不断累积,形成连续动效。
    tt

区域选择技巧

喷漆最怕喷歪。给沙盘喷漆之前,你会用报纸和遮蔽胶带把不想动的地方挡住。Motion Brush 的区域选择就是这个道理:笔刷划过的地方是「候选运动区」,笔画之外是「禁区」。你画的范围越精准,最终效果就越接近「只动该动的部分」。

实际操作中,笔刷大小直接控制区域粗细。笔刷太粗,背景会被卷进来,比如想让水面动,结果把岸边树影也一起带起来;笔刷太细,发丝、水纹、小光斑这些细节又容易被漏掉。经验做法是先用大笔刷做粗选,把主体区域整体覆盖一遍,再缩小笔刷,细致补上边缘细节。

从算法视角看,区域选择本质上是在生成一张遮罩。遮罩的每个像素值表示运动许可比例:0 代表完全不动,1 代表允许全幅度运动。中间值则用来做柔和过渡。

好的遮蔽等于成功了一半。不要用生硬的一刀切选区,边缘要留一点过渡带,让漆自然晕开,选区才不会像刀切一样在视频里露馅。

M(p)={1,p∈Ωbrush0,p∉Ωbrush\displaystyle M(p) = \begin{cases} 1, & p \in \Omega_{\text{brush}} \\ 0, & p \notin \Omega_{\text{brush}} \end{cases}
遮罩公式只是把「喷到」和「没喷到」翻译成 1 和 0,选区之外完全隔离。
  1. 像素位置p 表示画面里的任意一个像素点。
    pp
  2. 笔刷区域Ω_brush 是被笔画覆盖的所有点的集合。
    Ωbrush\Omega_{\text{brush}}
  3. 覆盖判定当 p 属于笔刷区域时,遮罩值取 1,运动许可全开。
    p∈Ωbrushp \in \Omega_{\text{brush}}
  4. 未覆盖判定当 p 不属于笔刷区域时,遮罩值取 0,保持静止。
    p∉Ωbrushp \notin \Omega_{\text{brush}}

运动方向控制

喷漆枪的喷嘴可以调方向,Motion Brush 的笔画也一样。你画一笔不只是圈范围,你拖动笔尖的路径,就是告诉模型「风往哪里吹」。如果想让小河向右流,就沿着河床从左往右画一笔;想让烟雾向左飘,就沿着烟雾路径从右往左带一下。

方向控制不是只能画一笔。同一画面里,不同局部经常需要不同的方向:头发向右飘、衣角向左扬、树叶向斜上方抖动。你可以在不同区域分别画上各自的方向。模型会把不同笔画的方向融合成一个连续的方向场,避免相邻区域之间像两块硬接的布料。

这种融合在数学上就是多次笔画的方向加权叠加。每一笔在某个位置的作用强度由笔刷浓度决定,浓度越高,这一笔对最终方向的影响越大。

沙盘上可以同时存在东南风和西北风,只要不同区域用不同笔尖方向,模型就会让每个局部各自随风而行,互不干扰。

D⃗(p)=∑k=1nwk(p) d⃗k\displaystyle \vec{D}(p) = \sum_{k=1}^{n} w_k(p)\, \vec{d}_k
最终方向不是某一笔单独决定的,而是把所有笔画按权重加起来,形成一个渐变的方向场。
  1. 最终方向D(p) 是像素 p 经过多笔合成后的运动方向。
    D⃗(p)\vec{D}(p)
  2. 第 k 笔方向d_k 是你画的第 k 笔的单位方向向量。
    d⃗k\vec{d}_k
  3. 笔画权重w_k(p) 表示第 k 笔在位置 p 的覆盖强度或浓度。
    wk(p)w_k(p)
  4. 累加求和Σ 把多笔贡献相加,让方向从一笔平滑过渡到另一笔。
    ∑k=1n\sum_{k=1}^{n}

幅度与速度控制

喷枪除了方向,还有出漆量旋钮。Motion Brush 的笔刷强度、不透明度或浓度,就相当于这个旋钮。旋钮拧小,树叶只是微微颤动;旋钮拧大,树叶能明显摆动。这个「动多大」的尺度,就是运动幅度。

运动幅度不是每一帧匀速往前推的。真实世界的运动通常有启动、加速、减速、停止。如果每一帧都线性位移,画面会像幻灯片平移,毫无质感。Motion Brush 类工具通常会提供强度曲线、速度曲线或时间权重,让你把运动节奏从「僵直平移」调成「自然摆动」。

一个常用的平滑运动模型是从 0 缓慢加速、再缓慢减速到终点,像喷漆从枪口轻轻涌出,最后稳稳收住。

拧出漆量时别贪多,先让局部轻轻动起来,再逐步加大幅度。风太大,容易把沙盘上其他小道具一起刮跑。

s(t)=A2(1−cos⁡(πtT))\displaystyle s(t) = \frac{A}{2}\left(1 - \cos\left(\frac{\pi t}{T}\right)\right)
这个公式让位移从 0 平滑增长到最大幅度 A,避免了匀速运动那种机械感。
  1. 位移量s(t) 表示时刻 t 相对原位置的偏移大小。
    s(t)s(t)
  2. 最大幅度A 由笔刷强度决定,喷得越浓,A 越大。
    AA
  3. 平滑因子1 - cos(πt/T) 在起点和终点附近变化都很慢,中间加速,形成柔和节奏。
    1−cos⁡(πtT)1 - \cos\left(\frac{\pi t}{T}\right)
  4. 运动时长T 控制整个运动完成的时间,T 越小,看起来越快。
    TT

参数精调方法

一个老练的喷漆工,不会一枪喷到底,而是调口径、调浓度、喷一层晾一层。Motion Brush 的参数面板就是你的喷漆工具箱:笔刷大小、不透明度、羽化、时间范围,每一项都值得单独打磨。

最关键的一项是羽化。羽化让遮罩边缘从 1 慢慢降到 0,而不是从 1 突然跳到 0。硬边会造成边缘像素在相邻帧之间时动时不动,出现闪烁和锯齿。就像喷漆到墙面边缘突然截止,会留下一道生硬的棱线;稍微让漆雾扩散一点,边界便自然融入背景。

羽化遮罩可以用一个平滑的 S 形函数表示:像素离笔刷边界越远,运动许可越接近 1;越接近边界外侧,越接近 0。

每调整一个参数,就循环预览几帧,再改下一项。少食多餐式调参,才能避免一次改太多,最后出了问题都不知道是谁的锅。

Mf(p)=11+e−k d(p)\displaystyle M_f(p) = \frac{1}{1 + e^{-k\, d(p)}}
参数 k 控制过渡带的宽窄:k 越大,边缘越硬;k 越小,过渡越柔和。
  1. 羽化后遮罩M_f(p) 表示经过边缘柔化后的运动许可值。
    Mf(p)M_f(p)
  2. 有符号距离d(p) 表示像素 p 到笔刷边界的距离,内部为正,外部为负。
    d(p)d(p)
  3. 软硬系数k 控制过渡带陡峭程度,k 越大,边界越锐利。
    kk
  4. S 形压缩1 / (1 + e^-x) 把任意实数压缩到 0 到 1 之间,形成平滑渐变。
    11+e−k d(p)\frac{1}{1 + e^{-k\, d(p)}}

实战完整流程

把喷枪收好之前,最后走一遍完整喷涂流程。假设你有一张湖面照片,想让湖水涟漪动起来,湖心小船保持不动。这个案例足够说明 Motion Brush 的标准工作流。

第一步是素材准备,确认画面分辨率、运动主体的边界和背景关系。第二步是首笔策略:先用大笔刷把水面区域粗喷一遍,方向沿波纹延伸方向轻扫,这样模型能抓住水流的整体趋势。第三步是检查修正:播放预览,如果发现湖边树影被带动,就缩小笔刷或降低不透明度,把多余区域擦掉。第四步才是导出合成,确认没有撕裂和闪烁后,再叠加调色、音效。

实战中经常需要控制运动只在一段时间内发生,比如前两秒水面静止,第三秒才开始起风。这时要使用时间范围控制,让运动只在指定窗口内生效。

完整流程就是一次「喷前检查、喷中观察、喷后修补」。不要指望一笔封神,小步迭代才是 Motion Brush 的真相。

Mt(p,t)=M(p)⋅1[ts,te](t)\displaystyle M_t(p,t) = M(p)\cdot \mathbb{1}_{[t_s,t_e]}(t)
这个公式表示:运动不仅要看空间上有没有被笔刷选中,还要看时间上是否落在启动和结束区间内。
  1. 时空遮罩M_t(p,t) 同时依赖空间位置 p 和时间 t,决定某一帧某一点能否运动。
    Mt(p,t)M_t(p,t)
  2. 空间遮罩M(p) 是该点是否被笔刷选中的空间许可。
    M(p)M(p)
  3. 指示函数1_{[t_s,t_e]}(t) 只有在 t 位于 [t_s,t_e] 区间内才等于 1,否则为 0。
    1[ts,te](t)\mathbb{1}_{[t_s,t_e]}(t)
  4. 整体效果空间许可和时间窗口相乘,让运动只在指定时间段发生。
    M(p)⋅1[ts,te](t)M(p)\cdot \mathbb{1}_{[t_s,t_e]}(t)

AI 应用场景

产品广告的局部光效流动

阶段:图生视频生成阶段的局部运动控制

解决的问题:传统广告片中,让产品标签上的高光自然流动,需要逐帧抠像、网格变形和跟踪绑定,工作量很大。Motion Brush 可以直接在静态产品图上圈出标签区域,用低强度笔刷画一条纵向路径,让光效柔和滑动,背景和瓶身保持静止。

具体案例:某护肤品牌需要一支精华液主图视频。把产品高清图导入工具,用 Motion Brush 选中标签上的高光区,画一条从上到下的短路径,强度设为 20%,时间曲线选平滑加速减速,生成 3 秒预览。画面中只有瓶身高光缓缓流动,品牌字和瓶盖纹丝不动。

老照片局部活化

阶段:后期动效微调

解决的问题:老照片活化时,最怕整张照片像果冻一样乱晃。Motion Brush 可以把运动严格限制在头发、衣角等局部,让五官和背景保持稳定,避免恐怖谷效果。

具体案例:一张民国时期全家福,希望照片中一位女士的头发和衣角轻轻飘动。用笔刷沿发梢和衣摆画斜向微风,开启羽化,最大幅度控制在 8%,时间曲线使用先快后慢的衰减节奏。生成后反复预览,发现衣角幅度偏大,再单独降低该区域强度,最终导出 5 秒动图。

Python 演示

python36 行
import numpy as np def build_circle_mask(h, w, cx, cy, r, feather=3.0):    y, x = np.ogrid[:h, :w]    d = np.sqrt((x - cx) ** 2 + (y - cy) ** 2)    mask = np.clip((r - d) / feather + 0.5, 0.0, 1.0)    return mask def motion_brush_frame(img, mask, velocity, t):    out = img.astype(np.float32)    h, w = img.shape[:2]    dy, dx = int(velocity[0] * t), int(velocity[1] * t)    src_y = np.clip(np.arange(h) - dy, 0, h - 1)    src_x = np.clip(np.arange(w) - dx, 0, w - 1)    shifted = img[src_y][:, src_x]    m = mask[..., None] if img.ndim == 3 else mask    out = img * (1 - m) + shifted * m    return np.clip(out, 0, 255).astype(np.uint8) def make_checkerboard(h, w, cell=16):    base = np.zeros((h, w), dtype=np.uint8)    parity = (np.arange(h)[:, None] // cell + np.arange(w)[None, :] // cell) % 2    base[parity == 0] = 255    return np.stack([base] * 3, axis=-1) def main():    h, w = 64, 96    img = make_checkerboard(h, w)    mask = build_circle_mask(h, w, 48, 32, 14, feather=4.0)    velocity = (0, 12)    for t in range(5):        frame = motion_brush_frame(img, mask, velocity, t)        print("frame", t, frame.shape, "mask_max", round(float(mask.max()), 2)) if __name__ == "__main__":    main()
目的:用 NumPy 模拟一个极简 Motion Brush 效果,在棋盘格图片上圈出一个圆形区域,让该区域内容随时间向右偏移,其他区域保持静止。
  1. mask = np.clip((r - d) / feather + 0.5, 0.0, 1.0)生成带羽化的圆形遮罩,内部接近 1,外部接近 0。
  2. shifted = img[src_y][:, src_x]从原图错位采样,模拟局部像素被推动后的效果。
  3. m = mask[..., None] if img.ndim == 3 else mask把遮罩扩展成三通道,方便直接和三通道图像相乘。
  4. out = img * (1 - m) + shifted * m只有遮罩为 1 的区域使用位移后的像素,其余保持原样。
  5. for t in range(5)按时间步生成 5 帧,验证运动是逐帧累积的。

常见误区

误区我以为笔刷画到的区域就是最终会动的所有像素;如果边缘还有一点在动,说明我画得不够准。

正解画到的区域只是运动许可区,模型还会根据纹理、前后景关系和光流决定哪些像素真正位移。运动可能在边缘轻微扩散,所以正确的做法是留出安全边距,并用羽化把过渡做柔和,而不是用硬边去卡死。

为何常见:工具名字里带「笔刷」,容易让人把它等同于 Photoshop 选区工具,以为选区就是精确结果。

误区画运动方向时,我总想把笔画拖得很长,觉得箭头越长,物体就动得越快、越明显。

正解笔画方向和位移路径不等于瞬时速度。速度主要由笔刷强度、幅度参数和时间曲线控制。拉长笔画可能只改变运动轨迹或终点,并不能直接让速度翻倍。

为何常见:现实中推东西用的力气越大,东西动得越快,所以下意识把笔画长度当成力量大小。

误区想让画面更活泼,就把运动幅度调得很大,反正 AI 会自动补全中间过程。

正解Motion Brush 适合局部微动。幅度过大时,模型没有足够的背景参考来补全被遮挡的像素,容易产生拉伸、扭曲、鬼影或画面撕裂。宁可小幅多次,也不要一次拉满。

为何常见:宣传片里的大动态很震撼,初学者容易忽略局部运动的物理约束和模型能力边界。

误区羽化这种参数,导出视频后根本看不出来,随便设一下就行。

正解硬边遮罩会让选区边界像素在相邻帧间时动时不动,产生闪烁和锯齿。羽化后过渡带里的运动权重平滑下降,人眼就不容易察觉分界线。静态截图看不出问题,但一播放就非常明显。

为何常见:闪烁是时间维度上的问题,只看单帧截图的人很难发现。

误区我觉得一次画完所有笔画,然后直接生成高清视频,不满意再重画,这样最节省时间。

正解AI 生成有随机性,直接出高清视频后发现问题,重画成本很高。正确流程是先低分辨率、短时长快速预览,对每一笔局部修正,确认运动自然后再做高清导出。

为何常见:很多人沿用传统滤镜的工作习惯,忽略了 AI 生成结果需要多次抽卡和迭代。

面试题

Q1. Motion Brush 的核心作用是?

单选题 · easy

  • A.生成整段视频的背景音乐
  • B.让局部区域按笔画运动← 正确答案
  • C.自动替换视频中的人物
  • D.提高视频文件清晰度

答案:B。Motion Brush 的核心是在图生视频中指定局部区域,并让该区域按笔画方向运动。它不会生成音乐、替换人物或提升画质,所以只有 B 符合。

Q2. 没有笔刷覆盖的区域,生成时通常会?

单选题 · easy

  • A.同样被带动起来
  • B.保持相对静止← 正确答案
  • C.自动变模糊
  • D.被裁剪掉

答案:B。没有笔刷覆盖的地方,遮罩值为 0,相当于没有得到运动许可证,模型通常会保持相对静止。这也是 Motion Brush 能做到局部控制的基础。

Q3. 羽化选区的主要作用是什么?

单选题 · mid

  • A.让边缘更生硬醒目
  • B.让运动过渡更柔和← 正确答案
  • C.让视频整体更清晰
  • D.加快渲染速度

答案:B。羽化让遮罩从 1 平滑降到 0,避免边缘像素在帧间突然启动和停止,从而减少闪烁和锯齿。它不能提升清晰度或渲染速度。

Q4. 只想让画面中的河水向右流,最合理的首笔操作是?

单选题 · mid

  • A.用最大笔刷涂满全屏
  • B.沿河水区域向右画一笔← 正确答案
  • C.在河岸左侧点一下
  • D.在天空画一个圆圈

答案:B。Motion Brush 的方向由笔画路径决定,所以应该沿河水区域从左向右画一笔。涂满全屏会让背景也动,点按和圆圈都不能表达明确的方向。

Q5. 哪些因素会影响局部运动的幅度?

多选题 · mid

  • A.笔刷强度或浓度← 正确答案
  • B.运动时间曲线← 正确答案
  • C.图片的文件格式
  • D.视频输出分辨率

答案:AB。幅度主要由笔刷强度决定,时间曲线决定运动如何加速和减速。文件格式和输出分辨率影响的是编码与清晰度,与运动幅度没有直接关系。

Q6. 同一画面多个区域要往不同方向运动,正确做法是?

单选题 · hard

  • A.所有区域共用一次笔画
  • B.分区域多次画方向← 正确答案
  • C.先压缩图片再操作
  • D.手动逐帧修补视频

答案:B。Motion Brush 支持多笔叠加,可以为不同区域分别画方向,模型会把多笔方向融成一个连续方向场。共用一笔无法表达不同方向,手动逐帧也不符合工具定位。

Q7. 以下哪些属于 Motion Brush 使用中的常见坑?

多选题 · hard

  • A.硬边缘引发闪烁← 正确答案
  • B.幅度过大画面撕裂← 正确答案
  • C.不看预览直接导出← 正确答案
  • D.调低视频输出分辨率

答案:ABC。硬边缘会导致遮罩突变更闪,幅度过大会拉伸像素,不预览直接导出会浪费大量重画时间。调低分辨率只是在压缩性能上取舍,不属于 Motion Brush 特有的坑。

Q8. Motion Brush 通常在哪个环节使用?

单选题 · easy

  • A.图生视频的局部运动控制← 正确答案
  • B.文本生成字幕配音
  • C.图像批量无损压缩
  • D.视频色彩科学校正

答案:A。Motion Brush 依赖静态图像作为底图,通过笔刷控制局部运动,所以属于图生视频阶段的运动控制,而不是字幕、压缩或校色功能。

Q9. 判断局部运动是否自然,最好依赖什么?

单选题 · mid

  • A.只看第一帧效果
  • B.连续预览多帧循环← 正确答案
  • C.放大静态边缘截图
  • D.直接看输出文件大小

答案:B。运动是否自然体现在时间维度上,单帧看不出发丝是否闪烁、幅度是否撕裂。连续预览多帧循环播放,才能发现边缘抖动、速度节奏等问题。

Q10. 提高局部运动自然度的技巧有哪些?

多选题 · hard

  • A.给选区加羽化过渡← 正确答案
  • B.小幅度多次迭代← 正确答案
  • C.让运动区域全图硬切
  • D.用时间曲线控制节奏← 正确答案

答案:ABD。羽化让边缘柔和,小幅度迭代能避免单次参数过大带来的撕裂,时间曲线则让运动更接近真实物理节奏。全图硬切会把所有区域一起带动,恰恰破坏了局部运动的自然度。