CUDA NPP库使用问题记录-nppiFilterMedian_16u_C1R

作者使用NPP库进行GPU平台的图像处理,在测试中值滤波时始终报错,通过阅读文档和网上查询找到了问题的关键:

1)通过nppiFilterMedianGetBufferSize_16u_C1R得到的buffersize始终为0,这其实不影响程序运行;

2)如果源图像和SizeROI(含义见滤波函数参数说明)具有相同尺寸,那么在进行卷积运算时,对于边缘像素计算时会出现内存访问越界,需要人为处理。不过这很好理解,即使在CPU下计算,也需要考虑图像边缘填充的问题。

解决方法:

1)作者使用nppiCopyConstBorder_16u_C1R将原图像拷贝到另一块内存,该函数的作用就是边界填充;

2)【关键步骤】给nppiFilterMedian_16u_C1R在传递输入图像数据地址的时候,由于边界填充的存在,需要考虑行偏移和列偏移量(作者16位源图像,这里的输入图像地址为:pSrcImgDeviceWithBorderFill+oAnchor.y*nSrcPitchDeviceWidthBorderFill/sizeof(Npp16u)+oAnchor.x),【以保证该地址指向的像素逻辑上也是原始输入图像(未经过边界填充)的第一个像素】;

3)经过上述两个步骤,则能保证所有的像素均能正确处理,否则的话,存在无法处理的边界或函数运行报错。

总结来说,上述问题是调用NPP库包含Neighborhood Operations操作的所有函数均需要考虑的问题,包含所有的滤波和形态学算法(Filtering Functions and Morphological Operations )。

参考:

1)https://stackoverflow.com/questions/38749362/cuda-npp-median-filter-for-16-bit-images,这里说的基本明白,但没有最终解决。

2)https://docs.nvidia.com/cuda/npp/nppi_conventions_lb.html#image_data_error_codes,这里介绍了Neighborhood Operations操作是如何导致越界的。

你可能感兴趣的:(科研,CUDA,NPP)