VPI - 视觉编程接口

3.2 版本

Python API

VPI 公开了一个 Python API,它提供了一种使用该库的简化方法,从而加快了开发周期。资源管理在后台自动完成,使开发人员能够专注于图像处理管道的定义。

要求

  • Ubuntu 20.04 或 22.04
  • Python 3.9 或 3.10
  • numpy >= 1.11.0
  • pillow >= 3.1.2

编写图像模糊应用程序

将以下代码复制到名为 main.py 的文件中。注释解释了它的工作原理。

30 import sys
31 import vpi
32 
33 import numpy as np
34 from PIL import Image
35 from argparse import ArgumentParser
36 
37 # 2. 解析命令行参数
38 # -----------------------------------------------------------------------------
39 parser = ArgumentParser()
40 parser.add_argument('input',
41  help='用作输入的图像')
42 args = parser.parse_args();
43 
44 # 3. 加载输入并将其包装到 VPI 图像中。
45 # -----------------------------------------------------------------------------
46 
47 # `Image.open` 返回一个 Pillow 图像,然后将其解释为
48 # 一个 numpy 数组。此数组最终被包装在适合的 VPI 图像中
49 # 供 VPI 算法使用。
50 try
51  input = vpi.asimage(np.asarray(Image.open(args.input)))
52 except IOError
53  sys.exit("输入文件未找到")
54 except
55  sys.exit("输入文件错误")
56 
57 # 4. 将其转换为灰度图像,并使用 5x5 盒式滤波器对其进行模糊处理
58 # 使用 ZERO 边界条件。
59 # -----------------------------------------------------------------------------
60 
61 # 在如下所示的 python 上下文中启用 CUDA 后端会使
62 # VPI 算法默认使用 CUDA 执行。这可以被覆盖
63 # 如果需要,可以在调用算法时通过指定参数 `backend=` 来覆盖。
64 with vpi.Backend.CUDA
65  # `image.convert` 将返回一个具有所需格式的新 VPI 图像,在
66  # 本例中为 U8(灰度,8 位无符号像素)。
67  # 返回新 VPI 图像的算法允许像这样的链式操作
68  # 如下所示,因为转换的结果随后被过滤。
69  # 最终结果最终存储在新的 `output` VPI 图像中。
70  output = input.convert(vpi.Format.U8) \
71  .box_filter(5, border=vpi.Border.ZERO)
72 
73 # 5. 将结果保存到磁盘
74 # -----------------------------------------------------------------------------
75 
76 # 下面启用的读取锁定上下文确保所有处理都已完成,并且
77 # 结果存储在 `output` 中。
78 with output.rlock_cpu() as outData
79  # `outData` 是 `output` 的 numpy 数组视图(不是副本)
80  # 内容,可通过主机 (cpu) 访问。
81  # 然后将 numpy 数组转换为 Pillo 图像并保存
82  # 到磁盘
83  Image.fromarray(outData).save('tutorial_blurred_python.png')

测试应用程序

一切就绪后,按如下方式执行脚本

python3 main.py <图像文件名>

<图像文件名> 替换为磁盘上的某个图像。