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

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

计算同尺寸的两张图的图像质量指数,《链接》
CUDA小白 - NPP(9) 图像处理 Statistical Operations_第1张图片

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

你可能感兴趣的:(c++,CUDA,NPP)