1

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)...(100, 100, 100) ですが、次のようになりました。

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 より大きい場合、エッジ値を返すだけです。

誰でもこれを説明できますか?ありがとう。

4

1 に答える 1

2

出典: http://www.khronos.org/registry/cl/specs/opencl-1.x-latest.pdf#page=213

「上記の式で選択された 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) で開始します。

于 2013-11-16T12:54:14.617 に答える