[25] cuda 应用之 nppi 实现图像色彩调整
在 NPPI(NVIDIA Performance Primitives)中,图像色彩调整通常包括以下几种操作:
- 亮度调整:增加或减少图像的亮度。
- 对比度调整:增强或减弱图像的对比度。
- 饱和度调整:增强或减弱图像的颜色饱和度。
- 色调调整:改变图像的色调(通常在 HSL 色彩空间中)。
NPPI 提供了一些函数来执行这些操作,这些函数通常操作的是图像的每个像素值或者调整图像的整体属性。
亮度调整
- 亮度调整是通过对图像的每个像素值增加或减少常数来实现的。可以使用
nppiAddC_8u_C3R
函数来实现。
NppStatus nppiAddC_8u_C3R(const Npp8u* pSrc, int nSrcStep,
Npp8u* pDst, int nDstStep,
NppiSize oSize, int nValue);
- 参数说明:
pSrc:输入图像数据的指针。
nSrcStep:输入图像的步长。
pDst:输出图像数据的指针。
nDstStep:输出图像的步长。
oSize:图像尺寸(宽度和高度)。
nValue:要增加或减少的亮度值。
//for ex
NppiSize oSize = {width, height};
Npp8u* pSrc = ...; // 输入图像
Npp8u* pDst = ...; // 输出图像
int nSrcStep = width * 3; // RGB 图像步长
int nDstStep = width * 3; // RGB 图像步长
int nBrightness = 30; // 增加亮度的值
// 增加亮度
NppStatus status = nppiAddC_8u_C3R(pSrc, nSrcStep, pDst, nDstStep, oSize, nBrightness);
if (status != NPP_SUCCESS) {
std::cout << "Error in brightness adjustment!" << std::endl;
}
对比度调整
- 对比度调整是通过乘以一个常数来实现的,这会改变图像的亮度差异。可以使用
nppiMultiplyC_8u_C3R
来实现对比度调整。
NppStatus nppiMultiplyC_8u_C3R(const Npp8u* pSrc, int nSrcStep,
Npp8u* pDst, int nDstStep,
NppiSize oSize, int nValue);
- 参数说明:
pSrc:输入图像数据的指针。
nSrcStep:输入图像的步长。
pDst:输出图像数据的指针。
nDstStep:输出图像的步长。
oSize:图像尺寸(宽度和高度)。
nValue:对比度调整的系数。
//for ex
NppiSize oSize = {width, height};
Npp8u* pSrc = ...; // 输入图像
Npp8u* pDst = ...; // 输出图像
int nSrcStep = width * 3; // RGB 图像步长
int nDstStep = width * 3; // RGB 图像步长
int nContrast = 2; // 对比度增强系数(大于1增强对比度,小于1减弱对比度)
// 增强对比度
NppStatus status = nppiMultiplyC_8u_C3R(pSrc, nSrcStep, pDst, nDstStep, oSize, nContrast);
if (status != NPP_SUCCESS) {
std::cout << "Error in contrast adjustment!" << std::endl;
}
颜色平衡
nppiColorBalance_8u_C3R
用于调整图像的颜色平衡。该函数通常用于调整红色、绿色和蓝色通道的增益,从而使图像的色彩分布得到改善或特定调整。
NppStatus nppiColorBalance_8u_C3R(const Npp8u* pSrc, int nSrcStep,
Npp8u* pDst, int nDstStep,
NppiSize oSize, float* pScaleFactors);
- 参数说明:
pSrc: 输入图像的数据指针(RGB 图像,8 位无符号整数类型)。
nSrcStep: 输入图像的步长(每行的字节数)。
pDst: 输出图像的数据指针(调整后的 RGB 图像)。
nDstStep: 输出图像的步长(每行的字节数)。
oSize: 图像的尺寸(宽度和高度),类型为 NppiSize。
pScaleFactors: 存储每个通道增益因子的数组。该数组的长度至少为 3,分别对应红色、绿色和蓝色通道的增益因子。
pScaleFactors[0]:红色通道的增益因子。
pScaleFactors[1]:绿色通道的增益因子。
pScaleFactors[2]:蓝色通道的增益因子。
返回值:
NPP_SUCCESS: 成功执行。
NPP_ERR_NULL_POINTER: 指针参数为空。
NPP_ERR_SIZE_MISMATCH: 输入和输出图像的尺寸不匹配。
NPP_ERR_GENERIC_ERROR: 一般错误。
#include <npp.h>
#include <iostream>
int main() {
// 图像的宽度和高度
int width = 640;
int height = 480;
// 输入和输出图像数据
Npp8u* pSrc = new Npp8u[width * height * 3]; // 输入图像(RGB格式)
Npp8u* pDst = new Npp8u[width * height * 3]; // 输出图像
// 输入和输出图像步长(每行字节数)
int nSrcStep = width * 3;
int nDstStep = width * 3;
// 图像尺寸
NppiSize oSize = {width, height};
// 设置通道增益因子
float pScaleFactors[3] = {1.2f, 1.0f, 0.8f}; // 红色通道增益1.2倍,绿色通道不变,蓝色通道减弱为0.8倍
// 调用nppiColorBalance_8u_C3R函数进行颜色平衡调整
NppStatus status = nppiColorBalance_8u_C3R(pSrc, nSrcStep, pDst, nDstStep, oSize, pScaleFactors);
if (status != NPP_SUCCESS) {
std::cerr << "Error in color balance adjustment!" << std::endl;
delete[] pSrc;
delete[] pDst;
return -1;
}
// 图像处理成功,可以保存或显示 pDst 图像
std::cout << "Color balance adjustment completed successfully!" << std::endl;
// 清理资源
delete[] pSrc;
delete[] pDst;
return 0;
}