概述
拉普拉斯金字塔是一种图像表示方法,它由一组带通图像和一个低频残差组成。
应用范围从图像压缩到细节处理,其中输入图像被分解为表示为拉普拉斯金字塔的频带。每个频带都可以独立操作。最终图像可以通过将所有频带和低频残差相加来重建。
实现
VPI 将近似的拉普拉斯金字塔实现为高斯金字塔的差分,如下所示
拉普拉斯金字塔的第 k 层可以通过以下公式获得
\[ L_k(I) = G_k(I) - u(G_{k+1}(I)) \]
其中
- \(I\) 是输入图像。
- \(L_k(I)\) 是拉普拉斯金字塔的第 k 层。
- \(G_k(I)\) 是高斯金字塔的第 k 层。
- \(u(\bullet)\) 是 2 倍放大操作。
该算法重复执行直到生成所有层级。
VPI 实现可以选择性地返回计算中使用的中间高斯金字塔,以防也需要这种表示。这样做不会产生性能损失。
C API 函数
有关实现该算法的限制、约束和后端列表,请查阅以下函数的参考文档
用法
语言
- 导入 VPI 模块
- (可选)创建一个 4 级 VPI 金字塔,用于存储高斯金字塔副产品。它使用 VPI 图像输入来获取其尺寸和格式。
gaussian = vpi.Pyramid(input.size, input.format, 4)
- 返回使用 CUDA 后端从输入图像创建的 4 级拉普拉斯金字塔。它还返回相应的高斯金字塔。输入是 VPI 图像,输出是 VPI 金字塔。
with vpi.Backend.CUDA
output = input.laplacian_pyramid(4, out_gaussian=gaussian)
- 初始化阶段
- 包含定义拉普拉斯金字塔生成器函数的头文件
- 定义输入图像对象
struct VPIImageImpl * VPIImage
图像句柄。
- 使用所需的层级数(在本例中为 4)和缩放因子(固定为 0.5)创建输出金字塔
int32_t w, h;
VPIStatus vpiImageGetSize(VPIImage img, int32_t *width, int32_t *height)
获取图像尺寸(以像素为单位)。
VPIStatus vpiPyramidCreate(int32_t width, int32_t height, VPIImageFormat fmt, int32_t numLevels, float scale, uint64_t flags, VPIPyramid *pyr)
创建具有指定标志的空图像金字塔实例。
struct VPIPyramidImpl * VPIPyramid
图像金字塔的句柄。
- 可选地,创建与拉普拉斯金字塔输出具有相同尺寸的高斯金字塔。其图像格式必须与输入图像的格式相同
VPIStatus vpiImageGetFormat(VPIImage img, VPIImageFormat *format)
获取图像格式。
- 创建流,算法将提交到该流以执行
struct VPIStreamImpl * VPIStream
流的句柄。
VPIStatus vpiStreamCreate(uint64_t flags, VPIStream *stream)
创建流实例。
- 处理阶段
- 将算法连同输入图像、输出金字塔和可选的高斯金字塔提交到流。该算法由 CPU 后端执行
VPIStatus vpiSubmitLaplacianPyramidGenerator(VPIStream stream, uint64_t backend, VPIImage input, VPIPyramid output, VPIPyramid gaussianPyr, VPIBorderExtension border)
从输入图像计算拉普拉斯金字塔。
@ VPI_BORDER_CLAMP
边界像素无限重复。
- (可选)等待直到处理完成
VPIStatus vpiStreamSync(VPIStream stream)
阻塞调用线程,直到此流队列中的所有提交命令完成(队列为空)。
- 清理阶段
- 释放流、输入图像、输出金字塔和可选高斯金字塔所持有的资源
void vpiImageDestroy(VPIImage img)
销毁图像实例。
void vpiPyramidDestroy(VPIPyramid pyr)
销毁图像金字塔实例以及它拥有的所有资源。
void vpiStreamDestroy(VPIStream stream)
销毁流实例并释放所有硬件资源。
有关更多信息,请参阅 VPI - 视觉编程接口 的“C API 参考”部分中的 拉普拉斯金字塔生成器。
限制和约束
CPU 和 CUDA 后端
- 输入图像和金字塔的基层必须具有相同的尺寸。
- 仅支持 scale=0.5(即,只能生成二元金字塔)。
- 如果使用高斯金字塔,则其图像必须与输入图像具有相同的格式。
- 以下图像格式被接受为输入图像
- 以下图像格式被接受为输出拉普拉斯金字塔
- 拉普拉斯金字塔的最粗糙层在概念上等同于高斯金字塔的最粗糙层。但是,在拉普拉斯金字塔输出格式的正动态范围小于输入格式的情况下,即输入格式为 VPI_IMAGE_FORMAT_U8,输出格式为 VPI_IMAGE_FORMAT_S8 或 U16 和 S16,最粗糙层中输出的像素值除以 2 以避免溢出。
其他后端
性能
有关如何使用下表性能表的信息,请参阅 算法性能表。
在比较测量结果之前,请查阅 比较算法运行时间。
有关性能基准测试的更多信息,请参阅 性能基准。
-