• CUDA小白 - NPP(9) 图像处理 Statistical Operations


    cuda小白
    原始API链接 NPP

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

    常见的NppStatus,可以看这里

    本文主要介绍的是NPP的统计操作的一些接口。由于接口较多,所以同等类型的只会稍微一笔带过。
    由于只是统计方面的一些操作,因此有些没有办法进行可视化展现。因此暂时仅介绍接口,如果后面有必要,或者有比较好的可视化idea,在进行补充。

    sum

    在这里插入图片描述
    计算图像像素通道求和

    /*
    需要额外开辟空间,可以调用nppiSumGetBufferHostSize_XX_XXX来获取需要额外空间大小。
    pSrc :           device source input uint8_t image
    nSrcStep:        input step
    oSizeROI:        sum roi
    pDeviceBuffer:   scratch buffer
    aSum:            Pointer to the computed sum
    */
    NppStatus nppiSum_8u_C3R(const Npp8u *pSrc,
    						 int nSrcStep,
    						 NppiSize oSizeROI,
    						 Npp8u *pDeviceBuffer,
    						 Npp64f aSum[3]);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    min/max

    最小值(Min),最大值(Max),最小值索引(MinIndx),最大值索引(MaxIndx),最小最大值(MinMax),最小最大值索引(MinMaxIndx),由于接口较为类似,次数仅介绍Min以及MinIndx。

    /*
    函数参数不难理解,与Sum异曲同工,MinIndx可以同时返回最小值对应的图像位置
    */
    NppStatus nppiMin_8u_C3R(const Npp8u *pSrc,
    						 int nSrcStep,
    						 NppiSize oSizeROI,
    						 Npp8u *pDeviceBuffer,
    						 Npp8u aMin[3]);
    NppStatus nppiMinIndx_8u_C3R(const Npp8u *pSrc,
    							 int nSrcStep,
    							 NppiSize oSizeROI,
    							 Npp8u *pDeviceBuffer,
    							 Npp8u aMin[3],
    							 int aIndexX[3],
    							 int aIndexY[3]);		
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    mean / mean_StdDev

    mean主要是计算图像的通道均值
    在这里插入图片描述
    mean_StdDev额外计算了一个
    在这里插入图片描述

    NppStatus nppiMean_8u_C3R(const Npp8u *pSrc,
    						  int nSrcStep,
    						  NppiSize oSizeROI,
    						  Npp8u *pDeviceBuffer,
    						  Npp64f aMean[3]);
    NppStatus nppiMean_StdDev_8u_C3CR(const Npp8u *pSrc,
    								  int nSrcStep,
    								  NppiSize oSizeROI,
    								  int nCOI,
    								  Npp8u *pDeviceBuffer,
    								  Npp64f *pMean,
    								  Npp64f *pStdDev);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    Image Norms

    还是三个大类:Norm,NormDiff以及NormRel。第一个是针对单张图片进行的Norm操作,后两个是针对两张图片完成的Norm操作。归一化的方法也分为三种,Inf,L1和L2

    /*
    同样需要额外的计算空间申请
    */
    NppStatus nppiNorm_L1_8u_C3R(const Npp8u *pSrc,
    							 int nSrcStep,
    							 NppiSize oSizeROI,
    							 Npp64f aNorm[3],
    							 Npp8u *pDeviceBuffer);
    NppStatus nppiNormDiff_L1_8u_C3R(const Npp8u *pSrc1,
    								 int nSrc1Step,
    								 const Npp8u *pSrc2,
    								 int nSrc2Step,
    								 NppiSize oSizeROI,
    								 Npp64f aNormDiff[3],
    								 Npp8u *pDeviceBuffer);
    NppStatus nppiNormRel_L1_8u_C3R(const Npp8u *pSrc1,
    								int nSrc1Step,
    								const Npp8u *pSrc2,
    								int nSrc2Step,
    								NppiSize oSizeROI,
    								Npp64f aNormRel[3],
    								Npp8u *pDeviceBuffer);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    DotProd

    在这里插入图片描述

    NppStatus nppiDotProd_8u64f_C3R(const Npp8u *pSrc1,
    								int nSrc1Step,
    								const Npp8u *pSrc2,
    								int nSrc2Step,
    								NppiSize oSizeROI,
    								Npp64f aDp[3],
    								Npp8u *pDeviceBuffer);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    CountInRange

    计算通道的最小值和最大值

    NppStatus nppiCountInRange_8u_C3R(const Npp8u *pSrc,
    								  int nSrcStep,
    								  NppiSize oSizeROI,
    								  int aCounts[3],
    								  Npp8u aLowerBound[3],
    								  Npp8u aUpperBound[3],
    								  Npp8u *pDeviceBuffer);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    MaxEvery/MinEvery

    三个通道的最值保存在pSrcDst中

    NppStatus nppiMaxEvery_8u_C3IR(const Npp8u *pSrc,
    							   int nSrcStep,
    							   Npp8u * pSrcDst,
    							   int nSrcDstStep,
    						       NppiSize oSizeROI);
    NppStatus nppiMinEvery_8u_C3IR(const Npp8u *pSrc,
    							   int nSrcStep,
    							   Npp8u *pSrcDst,
    							   int nSrcDstStep,
    							   NppiSize oSizeROI);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    Integral / SqrIntegral / RectStdDev

    积分图像
    Integral主要实现的是,计算(0,0)到(i,j)的像素值和并且加上一个特殊的值,最终的结果存储在输出的(i,j)位置。因此如果输入的尺寸是WxH,在输出的尺寸是(W+1)x(H+1)。
    在这里插入图片描述
    SqrIntegral 则是计算的像素的平方和
    在这里插入图片描述
    RectStdDev则是计算积分图像的标准差(ROI区域内)
    在这里插入图片描述

    NppStatus nppiIntegral_8u32f_C1R(const Npp8u *pSrc,
    								 int nSrcStep,
    								 Npp32f *pDst,
    								 int nDstStep,
    								 NppiSize oROI,
    								 Npp32f nVal);
    NppStatus nppiSqrIntegral_8u32f_C1R(const Npp8u *pSrc,
    								    int nSrcStep,
    								    Npp32f *pDst,
    								    int nDstStep,
    								    NppiSize oROI,
    								    Npp32f nVal);
    NppStatus nppiRectStdDev_32f_C1R(const Npp32f *pSrc,
    								 int nSrcStep,
    								 const Npp64f *pSqr,
    								 int nSqrStep,
    								 Npp32f *pDst,
    								 int nDstStep,
    								 NppiSize oSizeROI,
    								 NppiRect oRect);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    HistogramEven / HistogramRange

    图像直方图统计

    /*
    nLevels:  level size
    pHist:     the total number of pixels that fall into the range
    pBuffer:   scratch buffer
    */
    NppStatus nppiHistogramEven_8u_C3R(const Npp8u *pSrc,
    								   int nSrcStep,
    								   NppiSize oSizeROI,
    								   Npp32s *pHist[3],
    								   int nLevels[3],
    								   Npp32s nLowerLevel[3],
    								   Npp32s nUpperLevel[3],
    								   Npp8u *pBuffer);
    
    NppStatus nppiHistogramRange_8u_C3R(const Npp8u *pSrc,
    									int nSrcStep,
    									NppiSize oSizeROI,
    									Npp32s *pHist[3],
    									const Npp32s *pLevels[3],
    									int nLevels[3],
    									Npp8u *pBuffer);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    Image Proximity

    接口好多,没耐心看下去了!!!! 留个坑位

    Image Quality Index

    计算同尺寸的两张图的图像质量指数,《链接》
    在这里插入图片描述

    Error

    MaximumError,AverageError,MaximumRelativeError,AverageRelativeError

    /*
    计算两张图像的最大绝对误差
    需要额外的计算空间
    */
    NppStatus nppiMaximumError_8u_C3R(const Npp8u *pSrc1,
    								  int nSrc1Step,
    								  const Npp8u *pSrc2,
    								  int nSrc2Step,
    								  NppiSize oSizeROI,
    								  Npp64f *pError,
    								  Npp8u *pDeviceBuffer);
    NppStatus nppiAverageError_8u_C3R(const Npp8u *pSrc1,
    								  int nSrc1Step,
    								  const Npp8u *pSrc2,
    								  int nSrc2Step,
    								  NppiSize oSizeROI,
    								  Npp64f *pError,
    								  Npp8u *pDeviceBuffer);
    NppStatus nppiMaximumRelativeError_8u_C3R(const Npp8u *pSrc1,
    										  int nSrc1Step,
    										  const Npp8u *pSrc2,
    										  int nSrc2Step,
    										  NppiSize oSizeROI,
    										  Npp64f *pError,
    										  Npp8u *pDeviceBuffer);
    NppStatus nppiAverageRelativeError_8u_C3R(const Npp8u *pSrc1,
    										  int nSrc1Step,
    										  const Npp8u *pSrc2,
    										  int nSrc2Step,
    										  NppiSize oSizeROI,
    										  Npp64f *pError,
    										  Npp8u *pDeviceBuffer);
    
    • 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
    IQA

    计算两张图像的图像质量
    主要涉及的包括MSE,PSNR,SSIM,MS-SSIM等
    接口较多,按需索取

  • 相关阅读:
    JVM八股文
    交换机与路由器技术-06-路由器转发数据包封装过程
    R语言 titanic 数据挖掘作业
    Springboot 一行代码实现文件上传 20个平台!少写代码到极致
    Redis
    一比一还原axios源码(零)—— 是结束亦是开始
    【开源】JAVA+Vue.js实现APK检测管理系统
    软件测试需要学习什么?好学吗?需要学多久?到底是报班好还是自学好?
    io测试【FPGA】
    Dive into TensorFlow系列(1)-静态图运行原理
  • 原文地址:https://blog.csdn.net/u011732139/article/details/132874861