OpenCL image3d线性采样

OpenCL image3d线性采样,image,opencl,sample,linear-interpolation,Image,Opencl,Sample,Linear Interpolation,我正在用OpenCL做一些线性插值,但结果并不像预期的那样。所以我做了一个简单的测试,内核代码如下所示: const sampler_t sampler = CLK_NORMALIZED_COORDS_TRUE | CLK_FILTER_LINEAR | CLK_ADDRESS_CLAMP_TO_EDGE; // Kernel block. kernel void interpolate( global float4*input,

我正在用OpenCL做一些线性插值,但结果并不像预期的那样。所以我做了一个简单的测试,内核代码如下所示:

const sampler_t sampler = CLK_NORMALIZED_COORDS_TRUE | CLK_FILTER_LINEAR | CLK_ADDRESS_CLAMP_TO_EDGE;
// Kernel block.
kernel void interpolate(
                   global float4*input,
                   image3d_t image,
                   global float4*output)
{
    size_t i = get_global_id(0);
    float4 coord = input[i];
    float4 tap = read_imagef(image, sampler, coord);
    output[i] = tap;
}
2x2x2图像的像素(RGBA)如下所示:

cl_float4 image_data[8] = {
    {0, 0, 0, 0},
    {100, 0, 0, 0},
    {0, 100, 0, 0},
    {100, 100, 0, 0},
    {0, 0, 100, 0},
    {100, 0, 100, 0},
    {0, 100, 100, 0},
    {100, 100, 100, 0},
};
我使用了11个坐标((0,0,0),(0.1,0.1,0.1)…(1,1,1),从0到1,步骤0.1)来读取图像,我希望结果是(0,0,0),(10,10,10)…(100100100),但我得到了:

coordinate:0.000000, result: 0.000000
coordinate:0.100000, result: 0.000000
coordinate:0.200000, result: 0.000000
coordinate:0.300000, result: 10.156250
coordinate:0.400000, result: 30.078125
coordinate:0.500000, result: 50.000000
coordinate:0.600000, result: 69.921875
coordinate:0.700000, result: 89.843750
coordinate:0.800000, result: 100.000000
coordinate:0.900000, result: 100.000000
coordinate:1.000000, result: 100.000000
当坐标小于0.25或大于0.75时,它只返回边值

有人能解释吗?谢谢。

发件人:

如果上述方程式中选择的Tijk或Tij中的任何一个指向图像外部的位置,则边框颜色将用作Tijk或Tij的颜色值

低于0.25和高于0.75在您的情况下,它是从图像外部的像素值执行插值,因此它将它们钳制到边缘。因此,所有值都只是边值


为什么会这样?因为边缘像素的像素中心不位于0,所以在您的示例中,它位于0.25(0是左边缘,0.5是右边缘)。因此,在0和0.25之间采样的值会导致像素本身进行插值。您只需要访问0.25到0.75之间的阵列,就可以了。如果有更多像素,您只需要再次以不同的方式访问它。以4像素为例,以0.125(1/4/2)

I concur开始。该规范包括从坐标到所访问元素的精确数学,以及它们之间使用的混合。首先研究1D或2D情况,因为有较少的元素在起作用。对于非标准化坐标,可以添加0.5以说明中心偏移(您可以通过将元素计数减去1,然后再加上0.5,将0.0转换为1.0。感谢您的帮助,sharpneli和@Dithermaster。我在CPU和GPU中测试了代码,但它们之间的结果截然不同。我在这个链接中问了另一个问题,您能回答吗?