• CUDA小白 - NPP(4) 图像处理 Data Exchange and Initialization(2)


    cuda小白
    原始API链接 NPP

    GPU架构近些年也有不少的变化,具体的可以参考别的博主的介绍,都比较详细。还有一些cuda中的专有名词的含义,可以参考《详解CUDA的Context、Stream、Warp、SM、SP、Kernel、Block、Grid》

    常见的NppStatus,可以看这里

    如有问题,请指出,谢谢

    Convert Bit Depth

    主要分为两个大类,一个是数据类型的扩大(8u/s ->16u/s/f -> 32u/s/f),一个是缩小(32u/s -> 16u/s -> 8u/s)。

    // Alpha 表示4维图像在变换的过程中是否影响Aplha通道
    // Increase Bit Depth
    // _Ctx for nppStreamCtx
    // R 和 Rs的区别应该是 s涉及到有符号转换为无符号的时候需要添加,conversion with saturarion(饱和度)
    // 例如:
    //     nppiCOnvert_8u16u_C1R 就是将uint8_t的单通道图像转换为uint16_t的单通道图像
    //     nppiCOnvert_32s32u_C1Rs 就是将int32_t的单通道图像转换为uint32_t的单通道图像
    NppStatus nppiConvert_[TYPE1][TYPE2]_[Alpha]C[CHANNEL]R(const TYPE1 *pSrc, 
    									                    int nSrcStep,
    									                    TYPE2 *pDst,
    									                    int nDstStep,
    									                    NppiSize oSizeROI,
    									                    ...);
    // Decreased Bit Depth
    // 大致用法与上面的一致
    // 可以指定四舍五入的模式以及尺度,如果需要指定一般R的后面会跟上Sfs
    // 例如:
    //    nppiConvert_32u8u_C1RSfs(..., NppRoundMode , int nScaleFactor);
    NppStatus nppiConvert_[TYPE1][TYPE2]_[Alpha]C[CHANNEL]R(const TYPE1 *pSrc, 
    									                    int nSrcStep,
    									                    TYPE2 *pDst,
    									                    int nDstStep,
    									                    NppiSize oSizeROI,
    									                    ...);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    需要注意的是,所有16f数据类型的数据 在至少是16字节对齐的时候可以达到最优的性能

    Scale Bit Depth

    对于每个像素值进行scale的操作,同样也分为升和降两种。

    // dstPixelValue = dstMinRangeValue + scaleFactor * (srcPixelValue - srcMinRangeValue)
    
    // _Ctx for nppStreamCtx
    // Alpha 表示4维图像在变换的过程中是否影响Aplha通道
    // ============== Scale To Higher Bit Depth =================
    //    1. 8u -> 16u/s || 32 s
    NppStatus nppiScale_[TYPE1][TYPE2]_[Alpha]C[CHANNEL]R(const TYPE1 *pSrc, 
    									                  int nSrcStep,
    									                   TYPE2 *pDst,
    									                   int nDstStep,
    									                   NppiSize oSizeROI,
    									                   ...);
    
    //    2. 8u -> 32f  限定最小值和最大值
    NppStatus nppiScale_8u32f_[Alpha]C[CHANNEL]R(const Npp8u *pSrc, 
    						                     int nSrcStep,
    						                     Npp32f *pDst,
    						                     int nDstStep,
    						                     NppiSize oSizeROI,
    						                     Npp32f nMin,
    						                     Npp32f nMax,
    						                     ...);
    // ============== Scale To Lower Bit Depth =================
    
    //   1. 16u/s -> 8u || 32s -> 8u
    NppStatus nppiScale_[TYPE1][TYPE2]_[Alpha]C[CHANNEL]R(const TYPE1 *pSrc, 
    									                  int nSrcStep,
    									                  TYPE2 *pDst,
    									                  int nDstStep,
    									                  NppiSize oSizeROI,
    									                  NppHintAlgorithm hint,
    									                  ...);
    //    2. 32f -> 8u  限定最小值和最大值
    NppStatus nppiScale_8u32f_[Alpha]C[CHANNEL]R(const Npp8u *pSrc, 
    						                     int nSrcStep,
    						                     Npp32f *pDst,
    						                     int nDstStep,
    						                     NppiSize oSizeROI,
    						                     Npp32f nMin,
    						                     Npp32f nMax,
    						                     ...);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    Duplicate Channel

    主要是将单个通道的图像重复维多通道图像。

    // 以uint8_t的单通道变为三通道
    NppStatus nppiDup_8u_C1C3R(const Npp8u *pSrc,
    						   int nSrcStep,
    						   Npp8u *pDst,
    						   int nDstStep,
    						   NppiSize oDstSizeROI);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    以一个图像转为灰度图,然后调用接口变为三个通道的图像结果,代码比较简单,这里就不贴了,直接上结果。
    请添加图片描述

    Transpose

    transpose的功能与matrix的transpose比较类型,沿着图像主对角线完成的图像镜像。

    NppStatus nppiTranspose_8u_C3R(const Npp8u *pSrc,
    							   int nSrcStep,
    							   Npp8u *pDst,
    							   int nDstStep,
    							   NppiSize oSrcROI);	
    
    • 1
    • 2
    • 3
    • 4
    • 5

    由于代码也比较简单,这里就直接贴出最终的test结果了。
    请添加图片描述
    注意:

    1. 如果图像的宽高不等,则transpose之后的结果对应的step以及存图的时候需要注意一下正确的尺寸值。
    Swap Channels

    当前模块的比较常用的就是RGB和BGR的变换

    // 以为uint8_t为例,主要的接口有两个,第一个是输入与输出地址不同,第二个是同一个地址
    NppStatus nppiSwapChannels_8u_C3R(const Npp8u *pSrc,
    								  int nSrcStep,
    								  Npp8u *pDst,
    								  int nDstStep,
    								  NppiSize oSizeROI,
    								  const int aDstOrder[3]);
    NppStatus nppiSwapChannels_8u_C3IR(Npp8u *pDst,
    								   int nDstStep,
    								   NppiSize oSizeROI,
    								   const int aDstOrder[3]);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    例子也比较简答,使用起来也很方便,这里直接贴结果
    请添加图片描述

  • 相关阅读:
    jquery实现select多选框的左右移动
    Linux make/Makefile详解
    面试必备:HashMap底层源码原来是这么简单(分析)
    Spring Cloud Ribbon面试题
    华为S9312CPU占用率过高,查看BUFM占用最多
    Elasticsearch使用mapping映射定义以及基本的数据类型
    7.1提出问题&7.2欧拉方法
    快鲸智慧园区管理系统-提供智慧园区一站式解决方案
    Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)
    MXNet中图解稀疏矩阵(Sparse Matrix)的压缩与还原
  • 原文地址:https://blog.csdn.net/u011732139/article/details/132715280