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 imagenSrcStep:input stepoSizeROI:sum roipDeviceBuffer: scratch bufferaSum:Pointer to the computed sum*/NppStatus nppiSum_8u_C3R(const Npp8u *pSrc, int nSrcStep, NppiSize oSizeROI, Npp8u *pDeviceBuffer, Npp64f aSum[3]);

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]);

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);

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);

DotProd

NppStatus nppiDotProd_8u64f_C3R(const Npp8u *pSrc1,int nSrc1Step,const Npp8u *pSrc2,int nSrc2Step,NppiSize oSizeROI,Npp64f aDp[3],Npp8u *pDeviceBuffer);

CountInRange

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

NppStatus nppiCountInRange_8u_C3R(const Npp8u *pSrc,int nSrcStep,NppiSize oSizeROI,int aCounts[3],Npp8u aLowerBound[3],Npp8u aUpperBound[3],Npp8u *pDeviceBuffer);

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);

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);

HistogramEven / HistogramRange

图像直方图统计

/*nLevels:level sizepHist: the total number of pixels that fall into the rangepBuffer: 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);

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);

IQA

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