抠图是 PS 中的一项常用技术. 但是要做到完美地将图像中的目标选取出来往往费时费力. 近日, 一个名为 PyMatting 的项目无疑能够帮助你.
项目地址: https://github.com/pymatting/pymatting
无需手动, 一键抠图
抠图的 AI 应用场景是这样的: 给定一张图像, 通过划定一个区域, AI 应当能够估计到划定区域内的前景图目标, 并将这个前景完整地抽取出来, 用来替换到其他背景的图像中去.
因此, 抠图需要两个 AI 能力: 首先, AI 需要能够在划定的区域内识别目标. 其次, AI 要能够完整地将目标抽取出来, 没有划定错误的边缘, 模糊的图像等问题.
上图为项目作者提供的示例. 给定一只动物的图像(左上), 以及人划定的区域(右上), 算法应当能够获得划定区域内目标的阿尔法通道, 即区分前景和背景的黑白轮廓(左下). 有了这一数据, 就可以从原图中抠去目标, 并移动到新的图像中去(右下).
据项目介绍, PyMatting 具有以下特性.
首先, 项目能够完成阿尔法抠图 (Alpha Matting), 其中包括 Closed-Form 抠图, 大核抠图(Large Kernel Matting),KNN 抠图, 基于学习的数字抠图(Learning Based Digital Matting), 随机游走(Random Walk) 抠图等算法.
同时, 项目也能完成前景预估, 包括 Clos Form 前景预估和多级别前景预估 (基于 CPU,CUDA 和 OpenCL 等) 算法.
该项目还可以进行快速多线程 KNN 搜索, 不完全阈值化楚列斯基分解 (incomplete thresholded Cholesky decomposition),V 轮几何多网格预条件子(V-Cycle Geometric Multigrid preconditioner) 等.
使用方法
在使用前, 你需要保证电脑安装相应的 Python 环境(Python 3), 同时需要以下安装包:
- numpy>=1.16.0
- pillow>=5.2.0
- numba>=0.47.0
- scipy>=1.1.0
由于项目需要 GPU, 因此也需要 GPU 相关支持:
- cupy-cuda90>=6.5.0 or similar
- pyopencl>=2019.1.2
除此之外, 为了进行测试, 也需要:
pytest>=5.3.4
为了方便使用, 作者提供了一些示例代码. 例如, 如下代码中, 给定原始图像和抠图框, 可以抽取出阿尔法前景:
- from pymatting import cutout
- cutout(
- # input image path"data/lemur.png",
- # input trimap path"data/lemur_trimap.png",
- # output cutout path"lemur_cutout.png")
作者还提供了高级代码, 直接进行抠图, 生成新图像:
- image = load_image("../data/lemur/lemur.png", "RGB", scale, "box")
- trimap = load_image("../data/lemur/lemur_trimap.png", "GRAY", scale, "nearest")
- # estimate alpha from image and trimap
- alpha = estimate_alpha_cf(image, trimap)
- # make gray background
- new_background = np.zeros(image.shape)
- new_background[:, :] = [0.5, 0.5, 0.5]
- # estimate foreground from image and alpha
- foreground, background = estimate_foreground_ml(image, alpha, return_background=True)
- # blend foreground with background and alpha, Less color bleeding
- new_image = blend(foreground, new_background, alpha)
除了代码示例外, 项目还提供了测试代码, 可在主目录中运行:
python3 tests/download_images.py
- pip3 install -r requirements_tests.txt
- pytest
这一测试能够覆盖 89% 的代码.
除了项目外, 作者还提供了不同的抠图算法的基准测试结果, 如下所示:
不同算法在测试数据集上的均方误差大小.
可以看出, 基于学习的算法和 Closed-Form 算法都能取得不错的效果.
完整的基准测试结果: https://pymatting.github.io/benchmark.html
来源: http://www.tuicool.com/articles/mqiiMne