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]);
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 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);
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等
接口较多,按需索取