概述
直方图均衡化是一种在图像处理中使用图像直方图进行对比度调整的方法。 更多信息,请参阅 [1]。
输入 | 输出 |
| |
实现
此算法尝试基于直方图查找新的映射调色板。 考虑一个灰度图像 X,图像中灰度级的总数为 L。将图像的直方图表示为 \(H_x\)。 图像中级别为 \(i\) 的像素出现的概率为
\[ p[i] = H_x[i] / N \]
其中
对应于 \(p[i]\) 的累积分布函数为
\[ cdf_x[i] = \sum_{j=0}^{i}p[j] \]
使用累积分布函数将原始像素值转换为新的像素值,对应的像素值为
\[ y[i] = \sum_{j=0}^{i}p[j] * L \]
均衡化后图像直方图示例
输入 | 均衡化输出 |
| |
C API 函数
有关实现该算法的限制、约束和后端列表,请查阅以下函数的参考文档
用法
语言
- 导入 VPI 模块
- 使用 CUDA 后端均衡化输入图像直方图,创建带有结果的输出 VPI 图像。
with vpi.Backend.CUDA
output = input.eqhist()
- 初始化阶段
- 包含定义图像直方图均衡化函数的头文件。
- 定义输入图像。
struct VPIImageImpl * VPIImage
图像的句柄。
- 创建输出图像。
int w, h;
VPIStatus vpiImageCreate(int32_t width, int32_t height, VPIImageFormat fmt, uint64_t flags, VPIImage *img)
使用指定的标志创建空的图像实例。
VPIStatus vpiImageGetSize(VPIImage img, int32_t *width, int32_t *height)
获取图像尺寸(以像素为单位)。
- 由于此算法需要临时内存缓冲区,请在 CUDA 后端为其创建负载。
VPIStatus vpiCreateEqualizeHist(uint64_t backend, VPIImageFormat fmt, VPIPayload *payload)
为 vpiSubmitEqualizeHist 创建负载。
struct VPIPayloadImpl * VPIPayload
算法负载的句柄。
@ VPI_BACKEND_CUDA
CUDA 后端。
- 创建将在其上提交算法以供执行的流。
struct VPIStreamImpl * VPIStream
流的句柄。
VPIStatus vpiStreamCreate(uint64_t flags, VPIStream *stream)
创建流实例。
- 处理阶段
- 使用 CUDA 后端将算法连同所有参数提交到流。
VPIStatus vpiSubmitEqualizeHist(VPIStream stream, uint64_t backend, VPIPayload payload, VPIImage input, VPIImage output)
均衡化图像的直方图。
- (可选)等待直到处理完成。
VPIStatus vpiStreamSync(VPIStream stream)
阻塞调用线程,直到此流队列中的所有提交命令完成(队列为空)。
- 清理阶段
- 释放流以及输入和输出图像所持有的资源。
void vpiImageDestroy(VPIImage img)
销毁图像实例。
void vpiPayloadDestroy(VPIPayload payload)
释放负载对象和所有关联的资源。
void vpiStreamDestroy(VPIStream stream)
销毁流实例并释放所有硬件资源。
有关更多信息,请参阅VPI - 视觉编程接口的“C API 参考”部分中的 均衡化图像直方图。
性能
有关如何使用下面的性能表的信息,请参阅算法性能表。
在比较测量结果之前,请查阅比较算法运行时间。
有关性能基准测试方式的更多信息,请参阅性能基准。
-
参考
- https://en.wikipedia.org/wiki/Histogram_equalization