使用CUDA NPP函数进行超出图像边界的采样

时间:2017-10-26 19:26:42

标签: cuda npp

我正在使用其中一个nppiWarpPerspectiveBack CUDA nVidia Performance Primitives (NPP)函数来透视图像,我想知道当源图像被采样超出其边界时会发生什么(或超出源ROI)。

例如,以下代码通过根据3x3透视矩阵对源图像进行采样来创建目标图像:

const NppiSize Size = {W, H};
const NppiRect ROI = {0,0, W,H};
nppiWarpPerspectiveBack_8u_C3R(  // 8-bit, 3-channel images
     srcImagePtr, Size, srcPitch, ROI,
     dstImagePtr, dstPitch, ROI,
     transformMatrix,
     NPPI_INTER_LINEAR); 

这里的源图像和目标图像的大小都是WxH,但是得到的扭曲输入图像(在我的情况下)小于目标图像,因此像素将在源的ROI之外采样。

documentation非常稀疏,但它在第4.6.2.3节

中说明如下
  

一般的NPP原语和NPP邻域操作   特别要求所有读取和写入的像素位置都有效   并在各自图像的边界内。在外面采样   定义的图像数据区域导致未定义的行为和   可能导致系统不稳定。

我假设源ROI阻止了"未定义的行为"通过剪切源图像外的样本。来自第7.76.1节:

  

如果源像素小数x和y坐标大于或   等于oSizeROI.x并且小于oSizeROI.x + oSizeROI.width和   大于或等于oSizeROI.y且小于oSizeROI.y + oSize-   ROI.height然后源像素被认为是在源内   图像剪辑矩形和源图像被采样。否则   未对源图像进行采样,并且不写入目标像素   目的地形象。

在越界像素的实践中,似乎我得到了目标图像中的帧缓冲区中发生的任何随机垃圾(例如,如果目标图像最初是黑色则我变黑)。我希望它是黑色(或一些恒定的颜色),但我想非常确定我正在避免未定义的行为及其相关系统的不稳定性。

(顺便说一句,我认为上述文档中的oSizeROI是错误的,应该是oSrcROI,这是源图像的投资回报率。)

有谁知道这里的确定行为是什么?我安全吗?

0 个答案:

没有答案