周末你在帮奶奶整理老照片,想把站在老墙边的爷爷“请”进一张新年合影里。手机上的“智能抠图”轻轻一点,人物轮廓就被利落地取了出来——连衣领上支棱的绒毛、风里飘起的几根白发,都干干净净地跟着人走。这感觉就像一位老裁缝在精裁蕾丝花边:该留的花样留足,该剪的底布剪净,遇到半透明的细丝,还要恰到好处地“留几分”。 图像抠图(Image Matting)做的就是这件事。它不满足于“把照片切成人物和背景两半”,而是为每个像素判断“它有多大比例属于前景”——这个比例叫 alpha 不透明度。本文会用老裁缝做蕾丝的主线故事,带你从零看懂抠图的完整思路:合成方程、三值图 Trimap、色彩采样法、传播类方法、闭式求解、深度学习方案,最后落到工程评估与落地。公式出现时都配“逐字解析”,你只需要带着看故事的心情往下读。
掌握抠图原理,是理解美图、剪映、直播换背景等图像产品底层能力的关键一步,也是计算机视觉算法工程师的岗位基本功。
可视化演示
动态演示图像抠图算法原理入门的核心机制,通过概览/流程/对比/趋势四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
图像抠图算法原理入门:抠图算法 抠图算法概述 抠图算法原理 核心机制可视化 图像抠图算法原理入门整体架构与关键组件
抠图问题定义
老裁缝拿到一块带花纹的布料,第一件事不是下剪刀,而是看清“花样”和“底布”的界线。普通布料沿轮廓剪就行,可遇到蕾丝时界线模糊了:一根细丝横在底布上方,透过丝线隐约能看见底布颜色——它既属于花样,又“透”着底布。裁缝清楚,这类地方不能简单“剪掉”或“留下”,而要想清楚“每一处该留几成”。
图像抠图把“留几成”量化成一个专业概念:alpha 不透明度。对照片里的每个像素,算法输出一个 0 到 1 之间的数,1 表示完全属于前景(人物),0 表示完全属于背景(老墙),中间值表示半透明状态——比如发丝、玻璃杯边缘。把全图每个像素的 alpha 拼在一起,就是一张 alpha 图,也叫透明度蒙版。
数学上,相机拍到的像素颜色被看成“前景层与背景层的加权混合”,这就是合成方程:
细看这个等式会发现一个“数字谜题”:等号左边是 3 个已知数(RGB),等号右边却是 7 个未知数(α 一个、F 三个、B 三个)。也就是说,只看一个像素根本无法唯一确定答案——这正是抠图被称为“病态问题”(ill-posed)的原因。图像分割输出的是“0 或 1”的类别标签,相当于裁缝一把大剪刀沿轮廓粗剪;抠图要输出连续 alpha,相当于用手术刀精修到每一根发梢。两者常配合使用:先分割粗定位,再抠图精修。
回到老裁缝的案板前:蕾丝上的每根丝线都不是“留或剪”的二选一,而是“留几成、剪几成”的连续尺子。合成方程就是这把尺子的刻度——凡是能拍到的颜色,都藏着前景与背景各自的比例,抠图算法的全部努力,就是把这把尺子量准。
- 观测颜色 I_p相机记录的第 p 个像素的 RGB 颜色值,是抠图任务唯一的直接输入。
- 不透明度 α_p0 到 1 的标量,表示前景覆盖该像素的程度,边缘像素常取中间值。
- 前景色与背景色该像素完全属于前景或背景时应有的颜色,各含 3 个通道。
- 加权混合还原前景按 α_p 叠加、背景按 1-α_p 透过,加权相加恰好还原观测颜色。
三值图Trimap
动剪刀之前,经验丰富的老裁缝会用粉笔在布料上勾线。他勾三类标记:确定要留的花样区、确定要剪掉的底布区,以及“说不准,待会儿细看”的模糊带——比如蕾丝花边本身。这圈模糊带,就是整件活计的用心之处。
图像抠图把这份“粉笔勾线”叫做三值图(Trimap)。三值图是一张与照片等大的标记图:白色像素表示确定前景,黑色像素表示确定背景,灰色像素表示未知区域。算法只把力气花在灰色区域上,白区和黑区的 alpha 直接照抄:白区为 1、黑区为 0。三值图本质上把“病态问题”收敛成了一个“小范围补全问题”——未知带越窄,补全越容易。
那么灰色区域从哪来?最常见的方式是“膨胀法”:先用目标分割网络或背景差分得到粗略前景掩码,再用形态学膨胀把掩码边界向外扩几圈,膨胀圈与掩码之间的环形带就是未知区域。也可以由用户交互涂鸦划定。未知带越窄,求解越容易,但对 Trimap 自身的准确性越敏感;未知带越宽,算法对 Trimap 误差越鲁棒,但求解难度随之上升。这是一个工程上需要权衡的旋钮。
多数热门抠图论文会在“Trimap 自适应”上做文章,但万变不离其宗:那圈灰色是裁缝在蕾丝边上画的“小心线”——不是最终剪口,而是提醒剪刀,这一带要格外用心。后续所有算法的差异,都体现在“如何使用这圈灰色”上。
- 三区划分图像所有像素位置组成全集 Ω,被分成前景、未知、背景三个互不重叠的集合。
- 硬约束Trimap 给定后,前景区 α=1、背景区 α=0,成为不可违背的“硬条件”,像裁缝用粉笔钉死的留白线。
- 未知区求解全部计算集中于 Ω_U,算法结合邻域已知信息为其中的每个像素补全 α。
色彩采样法
裁缝怎么判断一根细丝该留几成?他会对比花样周围已有的纹样:如果丝线颜色更像左边确定要留的花色,就多留;更像底布颜色,就少留;介于两者之间,就留个中间数。这种“比色定夺”的直觉,正是色彩采样法的起点。
对每个未知像素,算法先在其邻域的确定前景区采集若干颜色样本、在确定背景区采集若干样本,组成候选“样本对 (F, B)”。然后检查该像素的观测颜色 I 离哪个样本对更近:如果 I 更接近前景样本 F,α 就偏向 1;更接近背景样本 B,α 就偏向 0;位于连线中点,α 约为 0.5。数学上,这等价于把 I 投影到从 B 指向 F 的线段上:
真实实现中,算法会采样大量样本对,再用代价函数打分——颜色拟合度要高、样本距离未知像素要近、前景与背景样本差异要大——选出综合得分最高的样本对。经典代表有 Bayesian Matting、Shared Matting 等。采样法速度快、思路直白,对硬边缘效果极佳;但缺点是当发丝与背景颜色相近、或边缘附近找不到干净样本时,容易“看走眼”,在发梢处染出杂色。
回到蕾丝上:采样法就是裁缝俯身凑近布料,用“比色”代替“推理”。只要花色与底布颜色分明,这招又快又准;可一旦丝线颜色和底布混在一起,再厉害的肉眼也会犯难——这时就需要换一种思路了。
- 颜色差向量 (I-B)观测色减去背景样本,代表“这个像素比背景多出的颜色分量”。
- 方向向量 (F-B)前景样本减去背景样本,给出“从背景走向前景”的方向。
- 投影与归一化把前者投影到后者方向上,再除以方向长度平方,得到观测色在“前景-背景线段”上的相对位置。
传播类方法
有时蕾丝边周围根本找不到足够的“确定花色”可参考,比如人物整片头发都是细细碎碎的丝缕。老裁缝会换个法子:顺着已经确定的边缘,一点一点往里“推”——相邻丝线的颜色相近,留法也应该相近。这种“由已知推向未知”的手法,对应传播类方法。
传播类方法的核心假设只有一句话:颜色平滑变化的地方,alpha 也应平滑变化。算法把 Trimap 已知区域的 alpha 当作种子,像墨水浸染宣纸一样逐步扩散到未知区域。扩散的力道由“颜色亲和度”决定:两个相邻像素颜色越接近,互相“传染”alpha 的权重就越大。整体上,每个未知像素的新 alpha 等于其邻域已知像素 alpha 的加权平均:
把全图的邻域关系写成矩阵,就得到亲和矩阵与拉普拉斯算子——这就是“泊松抠图”“随机游走抠图”等经典工作的数学骨架。传播法的优势在于对纹理丰富、发丝密集的区域更稳;劣势是“橡皮擦效应”:在颜色本来就模糊过渡的地方,反复平均会把边缘越磨越平,像墨汁晕过头糊掉了镂空花纹。
- 相似度权重 w_pq用颜色高斯核度量相邻像素 p 与 q 的颜色相似度,颜色越像权重越大。
- 加权平均把邻域内各像素的 alpha 按权重求和并归一化,得到 p 的新 alpha。
- 反复迭代至收敛所有未知点并行更新,多轮扩散后趋于稳定,等价于求解拉普拉斯方程。
闭式抠图求解
老裁缝做到第四天,心里开始有了“总谱”:整条蕾丝边的留法,其实服从同一个数学规律,不必一根丝一根丝地推。若能把全图的 alpha 当作一个整体设计,一次性优化出来,那该多省事?这就是闭式抠图(Closed-form Matting)的思想。
Levin 等人在 2008 年提出关键假设:在很小的局部窗口内,前景颜色 F 与背景颜色 B 各自近似落在一条“颜色线”上——这就是颜色线模型。由这个假设可以推导出一个只依赖于图像颜色的稀疏矩阵 L,称为抠图拉普拉斯(Matting Laplacian)。它编码的约束是:相邻且颜色相近的像素,alpha 应当相近。于是全图 alpha 的“不和谐程度”被写成二次型:
这个解法是“闭式”的——不需要反复调迭代步长,一次算出全局最优(在二次代价意义下)。它比逐点传播更全局,对发丝边缘的保持也更好;缺点是矩阵求解计算量大,且“颜色线假设”在强烈纹理区域会失效——就好比花纹过于细碎复杂时,“总谱”也概括不了全部细节。正因如此,今天的很多工业方案仍拿它当深度模型的“精修后处理”,让总谱与经验互相补位。
- alpha 向量把全图 N 个像素的 alpha 排成一列,作为待求的未知变量。
- 抠图拉普拉斯 LN×N 稀疏对称矩阵,由局部颜色线模型推出,写作度矩阵与亲和矩阵之差。
- 二次型能量对任意 alpha 计算一个非负的能量值,alpha 越符合颜色结构,能量越低。
- 带约束最小化固定 Trimap 已知区域的 alpha,求使 J 最小的 alpha,等价于解一次稀疏线性方程组,得到闭式解。
深度学习抠图
前面讲的都是“裁缝学徒”按显式规则操作:比色、扩散、列方程。而老师傅见得多了,扫一眼就知道“这类蕾丝该留几成”——这种“眼力”正是深度学习带给抠图的礼物:用海量数据训练出的先验。
现代基于深度学习的抠图,主流做法是把“原图 + Trimap”拼成 4 通道张量输入卷积神经网络,网络直接回归输出一张连续 alpha 图。结构上通常采用编码器-解码器(如 U-Net):编码器逐级下采样提取高层语义,解码器逐步上采样还原分辨率,中间的跳连(skip connection)把底层边缘细节传递到高层,避免发丝被磨没。整个流程是端到端的:输入照片,输出透明度蒙版,中间无需人工设计特征。
训练数据从哪来?最常用的思路是“合成数据”:准备一批纯前景图(含人工标注的 alpha),随机缩放、旋转后合成到各种背景图上,用合成方程生成“照片级”训练样本。模型在数十万张合成图上学习预测 alpha,损失函数常用预测值与真值的 L1/L2 差,并叠加梯度项保护边缘。代表性工作包括 Deep Image Matting、IndexNet、GCA Matting 等。
相比传统方法,深度模型在发丝、网格、半透明物体上明显更稳,这是它“见多识广”的红利。但它也有代价:需要 GPU 算力和大规模数据;并且可能产生“幻觉”——预测出图像里并不存在的前景色。所以工程上常让 Trimap 作为“粉笔线”压阵,给模型划定发挥范围,避免它天马行空。
- 网络映射深度网络 G 以原图 I 与 Trimap T 为输入,参数为 θ,输出全图 alpha 预测。
- 训练目标在大量合成数据上最小化预测 alpha 与真值 alpha 的绝对差损失。
- 推理流程输入拼接后的 4 通道张量,前向一次即得连续 alpha 图,无需迭代。
工程应用评估
蕾丝剪得好不好,外行看整体,内行看细节。好裁缝会把成品翻到背面,对着原设计图逐条丝线比照。在抠图的工程世界里,这把“对版的尺子”就是评估指标,其中最常用的是 SAD(绝对差之和)。
SAD 的计算很朴素:把预测 alpha 与真值 alpha 逐像素相减取绝对值,再求平均。数值越小,说明预测越接近真值。此外还有 MSE(均方误差)、Connectivity(连通性,专门惩罚把发丝“剪断”的错误)、Gradient(梯度误差,惩罚边缘过糊或过锐)。评估时通常先用合成数据——因为合成数据拥有“标准答案” alpha,正如裁缝对版需要原始设计图。
工程落地时,有三条实战经验:其一,“两段式”结构是主流——先用分割网络粗定位物体,自动生成 Trimap,再交给抠图模块精修边缘,分工明确;其二,传统采样法在 CPU 上毫秒级出结果,适合移动端实时预览,深度方法在 GPU 上数十毫秒,适合云端批量处理;其三,开源工具已很成熟,OpenCV 提供基础图像操作,PyMatting 库实现了采样法、闭式法、传播法,rembg 一行命令即可调用深度抠图。当前最难啃的硬骨头仍集中在发丝、透明玻璃、运动模糊和极端光照——这些地方,正是 alpha 连续性的“主战场”,也是每一位裁缝最见功力的角落。
- 预测与真值α̂ 是算法输出的透明度,α* 是数据标注的“标准答案”。
- 绝对差每个像素的偏差只取大小不计方向,防止正负抵消,能放大微小错误。
- 求平均除以像素总数 N,得到 0 到 1 尺度的平均误差,便于跨图、跨算法比较。
AI 应用场景
影视与短视频后期合成
阶段:图像分割(抠图)——合成前处理
解决的问题:传统绿幕抠像要求严格控制灯光、演员不能穿绿色衣物,且无法处理透明物体和飘逸发丝;在自然场景中想更换背景只能逐帧手工描边,成本极高。基于 Alpha Matting 的自动抠图在无绿幕条件下将人物(含发丝级细节)从任意场景分离,再合成到新背景中。
具体案例:一位自媒体博主在咖啡馆拍摄口播视频,上传素材到云端 API,系统自动输出带连续透明度的前景图,后期剪辑师只需把背景换成公司 logo 墙,再微调发丝边缘即可发布,单条视频后期时间从 2 小时压缩到 20 分钟。
电商商品图自动抠图
阶段:数据预处理
解决的问题:电商运营每天要处理数百张商品图,手工用钢笔工具抠图效率极低且边缘粗糙。AI 方案先粗分割得到商品掩码,再膨胀生成 Trimap,用精修模块估计玻璃瓶、薄纱等半透明边缘的连续 alpha,最终输出透明背景 PNG,供多平台投放。
具体案例:某服装电商上传模特穿搭图后,系统自动输出透明底商品图,白底图、透明图、场景图一次生成三份素材;遇到蕾丝袖口这类“半透明杀伤区”时,系统自动标记置信度低的区域,转交人工微调,误抠率下降约 70%。
Python 演示
"""图像抠图演示: 合成图像生成 + Trimap构建 + 色彩采样法估计alpha + SAD评估"""import numpy as np def make_synth_image(size=64, soft=3.0): """生成合成图: 平滑边缘的红色圆盘为前景, 渐变底色为背景""" yy, xx = np.mgrid[0:size, 0:size] cy = cx = (size - 1) / 2.0 r = size * 0.28 dist = np.sqrt((yy - cy) ** 2 + (xx - cx) ** 2) alpha_true = np.clip((r + soft - dist) / (2 * soft), 0.0, 1.0) fg = np.zeros((size, size, 3)) fg[alpha_true > 0] = (0.9, 0.2, 0.25) bg = np.zeros((size, size, 3)) bg[..., 0] = np.linspace(0.1, 0.6, size)[None, :] bg[..., 1] = np.linspace(0.3, 0.7, size)[None, :] bg[..., 2] = np.linspace(0.5, 0.9, size)[None, :] img = fg * alpha_true[..., None] + bg * (1 - alpha_true[..., None]) return img, fg, bg, alpha_true def dilate(mask, iters=2): """十字邻域二值膨胀: 把前景掩码向外扩若干圈""" out = mask.copy() for _ in range(iters): nxt = out.copy() nxt[1:, :] = np.maximum(nxt[1:, :], out[:-1, :]) nxt[:-1, :] = np.maximum(nxt[:-1, :], out[1:, :]) nxt[:, 1:] = np.maximum(nxt[:, 1:], out[:, :-1]) nxt[:, :-1] = np.maximum(nxt[:, :-1], out[:, 1:]) out = nxt return out def build_trimap(mask, unknown_iters=3): """由alpha真值生成三值图: 内部=前景, 外部=背景, 过渡带=未知""" fg = mask > 0.99 bg = mask < 0.01 trimap = np.zeros_like(mask, dtype=np.uint8) trimap[fg] = 255 ring = dilate(fg, unknown_iters) & ~fg & ~bg trimap[ring] = 128 return trimap def estimate_alpha(image, trimap): """色彩采样法: 未知像素找最近前景/背景样本, 用投影公式估计alpha""" fg_mask = trimap == 255 bg_mask = trimap == 0 unk_mask = trimap == 128 fg_colors = image[fg_mask] bg_colors = image[bg_mask] alpha = np.zeros(image.shape[:2]) for y, x in np.argwhere(unk_mask): pixel = image[y, x] f = fg_colors[np.argmin(((fg_colors - pixel) ** 2).sum(axis=1))] b = bg_colors[np.argmin(((bg_colors - pixel) ** 2).sum(axis=1))] d = f - b denom = float(d @ d) a = float((pixel - b) @ d) / denom if denom > 1e-9 else 0.5 alpha[y, x] = min(1.0, max(0.0, a)) alpha[fg_mask] = 1.0 alpha[bg_mask] = 0.0 return alpha def sad(pred, truth): """SAD指标: 平均绝对差, 越小越接近真值""" return float(np.abs(pred - truth).mean()) def main(): img, fg, bg, alpha_true = make_synth_image() trimap = build_trimap(alpha_true) alpha_est = estimate_alpha(img, trimap) print("未知像素数:", int((trimap == 128).sum())) print("SAD误差: {:.4f}".format(sad(alpha_est, alpha_true))) new_bg = np.zeros_like(bg) comp = fg * alpha_est[..., None] + new_bg * (1 - alpha_est[..., None]) print("换背景合成尺寸:", comp.shape) if __name__ == "__main__": main()
img = fg * alpha_true[..., None] + bg * (1 - alpha_true[..., None])合成方程的实际编码,前景按 alpha 叠加在背景上。alpha_true = np.clip((r + soft - dist) / (2 * soft), 0.0, 1.0)生成 0 到 1 之间连续变化的“软边缘”真值,模拟发丝般的半透明过渡。ring = dilate(fg, unknown_iters) & ~fg & ~bg用膨胀法自动生成 Trimap 的灰色未知带,对应正文“掩码膨胀”思路。fg_colors = image[fg_mask]收集确定前景区域的全部颜色样本,作为“留给裁缝参考的花色”。f = fg_colors[np.argmin(((fg_colors - pixel) ** 2).sum(axis=1))]在颜色空间里找与当前像素最相似的前景样本。a = float((pixel - b) @ d) / denom投影公式计算 alpha,对应 (I-B)·(F-B)/‖F-B‖²。alpha[fg_mask] = 1.0Trimap 硬约束:已知前景区 alpha 直接置 1,不参与估计。
常见误区
误区我觉得抠图和分割是一回事,都是把目标从背景里圈出来,一个算法搞定两者,不用区分。
正解分割输出每个像素的类别标签(0 或 1),抠图输出连续的 alpha(0 到 1 之间)。发丝处的 alpha 可能是 0.3 或 0.7,分割却只能硬着头皮给个 0 或 1。分割像大剪刀沿轮廓粗剪,抠图像手术刀精修到发梢。工程上常见“先分割粗定位、再抠图精修”的两段式流程,二者互补而非彼此替代。
为何常见:两者的目标看起来都是“把目标与背景分开”,且深度方法中常共用骨干网络,科普文章中边界模糊,容易让人误解为一个任务。
误区三值图一定是人拿画笔在照片上一点点涂出来的,费时费力,所以抠图很难自动化。
正解工程上 Trimap 常由目标检测/分割网络先出粗略前景掩码,再做形态学膨胀自动生成“前景+背景+未知带”,人工只负责在结果不满意时小范围修正。Trimap 本质是约束工具,它的生产完全可以自动化。
为何常见:论文和教材为了实验公平常使用人工标注的高质量 Trimap,初学者看到实验设置便误以为这是唯一途径。
误区总想把 alpha 阈值化成二值掩码,觉得 0.5 之类的中间值只是算法不够准的产物。
正解半透明是真实世界的常态:一根头发丝只占像素面积的三成、玻璃瓶通透、运动物体边缘模糊——这些像素的真实 alpha 就是 0 到 1 之间的数。强行二值化会产生锯齿和“白边”,这正是抠图区别于分割的意义所在。
为何常见:人眼习惯用“物体/背景”的二元认知看世界,加上分割科普先入为主,让人忽略了像素内部的亚分辨率结构。
误区直接上最新深度模型就行,采样法、闭式法都是过时技术,不值得花时间学。
正解深度方法仍需 Trimap 作输入、依赖合成方程生成训练数据;许多工业方案用经典方法做移动端轻量实时版,或用闭式解对深度输出做平滑后处理。理解传统方法能帮你快速定位模型失效原因——比如颜色线假设在哪类纹理下被破坏。
为何常见:学术宣传聚焦 SOTA 指标,容易让人误以为高指标模型已全面取代旧思路,忽略了工程中的成本、算力与可解释性约束。
面试题
Q1. 合成方程 I = αF + (1-α)B 中,当 α=0 时该像素呈现?
- A.完全显示前景颜色
- B.完全显示背景颜色← 正确答案
- C.前景与背景各占一半
- D.两者颜色都无法呈现
答案:B。α=0 表示前景覆盖比例为 0、背景比例为 1,像素完全由背景决定。就像蕾丝边外完全没有丝线覆盖的底布部分,剪裁时应完全归入背景。A 是 α=1 的情况,C 是 α=0.5,D 不存在于合成方程中。
Q2. 某像素观测色 I=0.5,前景样本 F=1.0,背景样本 B=0.2(一维简化),用投影法估算 alpha 约为?
- A.0.18
- B.0.38← 正确答案
- C.0.58
- D.0.78
答案:B。代入投影公式 α=(I-B)/(F-B)=(0.5-0.2)/(1.0-0.2)=0.375,最接近 0.38。计算时先把观测色减去背景色得到“超出背景的分量”,再除以前景与背景的差,正是把观测色投影到前景-背景线段上的简化一维情形。
Q3. Trimap 中灰色(128)区域的语义是?
- A.确定属于背景的区域
- B.确定属于前景的区域
- C.未知区域待算法求解← 正确答案
- D.需要算法给出答案
答案:C。灰色区域是未知区,alpha 尚未确定,需要抠图算法结合邻域已知信息去估计;白色区域 alpha=1,黑色区域 alpha=0。C 和 D 表述相近,但 C 更准确地描述了它的“待求解”语义——算法不是凭空给答案,而是基于邻域约束求解。
Q4. 色彩采样法估计 alpha 的核心思想是?
- A.比较像素与邻域样本的相近程度← 正确答案
- B.对整张图片做快速傅里叶变换
- C.用随机森林回归出所有像素值
- D.把每个像素复制到输出图层上
答案:A。采样法在已知前景/背景区域采集颜色样本,看未知像素的颜色更靠近哪一端,用投影算出连续 alpha。B、C、D 分别是频域变换、传统机器学习回归和图像复制操作,与“颜色比对吧”的思路无关。
Q5. 传播类方法最重要的前提假设是?
- A.所有像素的透明度都完全一致
- B.颜色相近的邻域像素透明度应相近← 正确答案
- C.图片的背景必须是纯白或者纯黑
- D.前景区域一定比背景区域面积大
答案:B。传播法假设颜色平滑处 alpha 也平滑,因此用颜色相似度作为权重把已知 alpha 扩散到未知区。B 正是这一假设的通俗表述。A 与半透明现实矛盾,C 和 D 都不是传播法的前提条件。
Q6. 关于闭式抠图(Closed-form Matting),下列说法正确的是?
- A.需要在每个像素上迭代几千次才能收敛
- B.颜色线模型假设窗口内前景背景各在一根线附近← 正确答案
- C.把优化问题写成二次型并一次性求解析解← 正确答案
- D.输出结果一定是完全二值化的前景掩码
答案:BC。闭式抠图假设局部窗口内前景色和背景色各自落在一条颜色线上,由此构造抠图拉普拉斯矩阵,把 alpha 求解写成二次型最小化,一次解稀疏线性方程即可,无需迭代,故 A 错。它输出连续 alpha 而非二值掩码,D 错。
Q7. 为什么抠图常被称为“病态问题(ill-posed)”?
- A.因为图像处理时电脑会经常死机报错
- B.因为前景背景互相遮挡导致图像模糊
- C.因为观测只有3个值而未知量多达7个← 正确答案
- D.因为拍摄照片时相机抖动导致成像差
答案:C。每个像素只有 RGB 三个观测值,却要估计 α、F(3 通道)、B(3 通道)共 7 个未知量,方程数远少于未知数,解不唯一。这正是需要 Trimap 等先验约束的根本原因,与电脑故障、遮挡模糊、相机抖动无关。
Q8. 以下哪些属于深度抠图网络的常见设计或训练要诀?
- A.输入为原图与Trimap拼接的多通道张量← 正确答案
- B.学习目标是在合成数据集上预测连续Alpha← 正确答案
- C.编码器解码器加跳连结构保留边缘细节← 正确答案
- D.输出结果直接替代原图无需任何后期处理
答案:ABC。主流深度抠图把原图 3 通道与 Trimap 1 通道拼接成 4 通道输入;用合成数据生成带真值 alpha 的训练样本;编码器提取语义、解码器恢复分辨率,跳连保留发丝边缘。输出后仍需合成、修边等后期流程,D 错。
Q9. 在数据集上比较两个抠图算法的好坏,最常用的做法是?
- A.直接目测两张效果图凭感觉打分
- B.计算预测Alpha与真值Alpha的SAD误差← 正确答案
- C.比较两个模型的参数量并选更大的
- D.看哪个模型在训练集上损失更低
答案:B。SAD(绝对差之和)是抠图最常用的客观指标,逐像素比较预测 alpha 与真值 alpha 并求平均,数值越小越好。目测不客观,参数量大不代表精度高,训练集损失低可能只是过拟合。
Q10. 关于 Trimap 的未知区域,下列正确的是?
- A.未知区域越窄求解越容易但越依赖Trimap← 正确答案
- B.未知区域可由前景掩码膨胀自动生成← 正确答案
- C.未知区域中每个像素都需要算法来估计Alpha← 正确答案
- D.未知区域必须包含整张图像的所有像素
答案:ABC。未知带越窄,约束越强、求解越容易,但一旦 Trimap 标注不准就会把错误带进结果;工程上常用掩码膨胀自动生成未知带;灰色区每个像素的 alpha 都需估计。未知区域只是图像的一部分,若包含全部像素则等于没有提供任何先验,D 错。