문제

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보다 큰 경우 가장자리 값만 반환합니다.

누구든지 이것을 설명할 수 있나요?감사해요.

도움이 되었습니까?

해결책

에서: 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)로 시작합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top