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操作是如何导致越界的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值