关于 alpha-cutout
alpha-cutout 通过让主体置于纯色背景板上拍摄,再逐帧去除背景,制作透明视频和图像素材。它面向需要将动画主体合成到网页设计中的创作者,支持播放和滚动控制所需的多种输出格式。
主要功能
- 01选择抠像背景颜色
- 02逐帧去除背景
- 03导出叠层 MP4、透明 WebM 或图像
- 04用 canvas 播放叠层透明视频
- 05在多种背景上检查抠像效果
适用场景
- 01将角色合成到网页中
- 02制作透明循环视频素材
- 03创建用于滚动控制动画的帧
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ moh4696/ open-3d-skills --skill alpha-cutout安装后在 Claude Code 中输入/alpha-cutout确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
agents/openai.yamlassets/alpha-video.jsscripts/key.pyplate.py详细介绍
Alpha 抠像
图生视频模型永远不会返回 alpha。一个应该站在巨型标题和太阳圆盘之间的角色,或一个应该悬浮在页面上的瓶子,都需要逐帧移除背景,而且要足够干净,确保在任何页面颜色上都不会出现边缘杂色。这个技能采用电影工作室的做法:让主体置于纯色背景上拍摄,然后逐帧提取遮罩。
工具
| 文件 | 功能 |
|---|---|
scripts/plate.py | 将抠出的主体放置在留有顶部空间的色键底板上;挑选与主体冲突最少的键色 |
scripts/key.py | 将视频片段或静帧抠像为堆叠式 MP4、VP9 alpha WebM、RGBA WebP 帧或 PNG |
assets/alpha-video.js | 在 canvas(WebGL)上播放带透明度的堆叠 alpha MP4,并提供用于拖动预览的 seek() |
需要 Python 3.9+、pip install numpy opencv-python-headless pillow,以及 PATH 中的 ffmpeg。
流程
-
从静帧中抠出主体。 任何背景移除工具都可以。检查它漏掉了什么:细小物体(空中的球、球拍线、头发)经常会消失。手动把它们补回来。
-
制作底板。
python3 scripts/plate.py subject.png plate.png --size 1350x1800 --fit 0.8脚本会报告主体与洋红色、绿色和蓝色键色接近的部分各占多少,并挑选最干净的颜色。通常洋红色最合适:皮肤、衣物、产品或植物中几乎没有纯洋红色。绿色对植物和绿色产品无效;蓝色对牛仔布和天空无效。主体特意以硬边贴上去:与底板颜色预先混合的柔边会让模型学着画出杂色边缘。
为动作留出空间。发球需要头顶上方有空间;转身需要侧面有空间。让底板的宽高比与视频模型的输出宽高比一致,以免画面被裁切。
-
在底板上生成。 将底板用作起始帧(要制作无缝循环时也用作结束帧;参见
motion-assets)。提示词必须提到底板,否则模型会自行编造背景:背景必须保持完全平坦、均匀、纯色的色度键洋红色(精确 RGB 255, 0, 255),并填满整个画面;不能有阴影、地面、渐变、暗角或场景。相机固定不动。
提示词的作用胜过图像。 如果提示词中残留“白色背景”,无论底板是什么,生成的都会是白色背景。每次编辑后都要重新检查提示词。
-
进行抠像。
python3 scripts/key.py clip.mp4 --png check/ --frame-list 0,40,80,120 # inspect first python3 scripts/key.py clip.mp4 --stacked hero-1080.mp4 --width 1080 python3 scripts/key.py clip.mp4 --stacked hero-720.mp4 --width 720 # phones python3 scripts/key.py clip.mp4 --frames serve/lg --width 960 --start 0 --end 78--png会输出每帧测得的底板颜色。模型会让底板颜色产生漂移:纯洋红色可能在中途变成浅粉色(250, 178, 243),而主体仍保持原有颜色。因此,键色会从每帧自身的边框中逐帧测量,而不是只设置一次。如果主体接触顶部边缘,测量就会出错,脚本会提示这一点。随后逐像素处理:alpha 根据像素键色超出底板颜色的程度计算,边缘像素会与底板颜色反混合(
F = (C - (1 - a) K) / a),残留的溢色会被限制。反混合很重要。普通色键或向中性色夹取,会把洋红色边缘混合色变成棕褐色;在白衬衫上看起来就像鲑红色轮廓。反混合则能还原真实的边缘颜色。 -
在三种背景上检查:近黑色、页面的浅色,以及品牌中最鲜艳的颜色。合成
--png输出,并以 100% 和 400% 缩放查看边缘。重点检查头发、手指、细小道具、运动模糊,以及底板漂移最严重的那一帧。
修复
| 现象 | 处理方法 |
|---|---|
| 主体周围有一圈细细的轮廓 | 使用 --erode 1(很少需要用到 2)。模型将边缘复制到了图像中 |
| 亮部或闪亮部位出现孔洞 | 该颜色与键色太接近。换用其他键色重新生成(plate.py --key) |
| 整个背景泛粉色或绿色 | 色板渐变比平时更强;检查测得的色板颜色,并略微调高 --solid |
| 片段中途某个细节变了颜色(帽子变成绿色) | 这是模型漂移,不是键控故障。为这些帧中的该色相重新着色,或重新生成 |
| 压缩后主体周围出现彩色线条 | 已处理:透明像素下的颜色是向外延展的主体自身边缘色,因此色度子采样没有外部颜色可供渗入。--fill 只设置远离主体处的颜色 |
选择哪种输出
| 输出 | 可播放平台 | 适用场景 |
|---|---|---|
--stacked MP4 + assets/alpha-video.js | 所有浏览器,包括 Safari 和 iOS | 循环播放的主视觉、角色,以及任何需要播放的内容 |
--webm VP9 alpha | Chrome、Edge、Firefox。不支持 Safari | 无需支持 Safari 的普通 <video> 标签 |
--frames WebP 序列 | 所有平台 | 滚动控制的动画(参见 scroll-film):每个滚动位置对应精确的一帧,无寻帧延迟 |
堆叠式 alpha 会将帧高加倍(上方为颜色,下方为蒙版),再通过着色器将两者重新组合,因此它是普通 H.264:可在所有设备上通过硬件解码,文件大小约为纯颜色视频的 1.3 倍。提供两种宽度(1080 和 720),并根据视口选择。
import { AlphaVideo } from "./alpha-video.js";
const hero = new AlphaVideo(document.querySelector("canvas.hero"), innerWidth > 900 ? "hero-1080.mp4" : "hero-720.mp4");
hero.onready = () => document.body.classList.add("hero-ready");
function frame() { hero.draw(); requestAnimationFrame(frame); }
requestAnimationFrame(frame);
播放器会在离开屏幕时自动暂停,并且只有视频画面前进后才会上传纹理。若要进行滚动控制,请使用 { loop: false, autoplay: false } 创建播放器,并在滚动处理程序中调用 hero.seek(seconds)。
请从支持 HTTP Range 请求的服务提供视频(frame-capture 技能中的 serve.py 支持;python3 -m http.server 不支持),否则无法寻帧。
减少动态效果
当 prefers-reduced-motion: reduce 生效时,显示一张去除键色的静帧(使用 --png 导出合适的帧,再转换为 WebP),而不是循环播放。