当前位置: 首页 > article >正文

[25] cuda 应用之 nppi 实现图像色彩调整

[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;
}


http://www.kler.cn/a/533512.html

相关文章:

  • 服务端渲染技术
  • Mac M1 Comfyui 使用MMAudio遇到的问题解决?
  • Shell基础:中括号的使用
  • 【PyQt】getattr动态访问对象的属性
  • Python网络自动化运维---批量登录设备
  • 网站快速收录:如何优化网站音频内容?
  • Java进阶(JVM调优)——阿里云的Arthas的使用 安装和使用 死锁查找案例,重新加载案例,慢调用分析
  • 解决浏览器播放音频声音,没交互前不播放问题
  • 设计模式Python版 外观模式
  • 国产化创新 守护开放边界网络安全
  • cocos spine执行动画报错Cannot read properties of null (reading ‘data‘)
  • Android原生开发入门
  • Unity 2D实战小游戏开发跳跳鸟 - 记录显示最高分
  • leetcode——子集(java)
  • Python实现CAN FD 通信(基于PCAN开发CAN FD测试工具)
  • vue3新建组件库项目并上传到私库
  • 实时波形与频谱分析———傅立叶变换
  • RabbitMQ深度探索:消息幂等性问题
  • MongoDB 查询文档
  • 哈夫曼树原理及其C语言实现
  • 时间对象管理相关
  • gesp(C++六级)(13)洛谷:P11375:[GESP202412 六级] 树上游走
  • 因果推断与机器学习—可解释性、公平性和因果机器学习
  • go运算符
  • Redis缓存穿透、击穿、雪崩介绍以及解决方案
  • vscode 设置在编辑器的标签页超出可视范围时自动换行(workbench.editor.wrapTabs)