使用 OpenCL 内核的最近邻插值代码
Nearest Neigbour Interpolation code using OpenCL kernel
我需要编写一个 OpenCL 内核。通过内核参数,我得到了一个具有特定维度的输入图像(例如:width: 600px, height: 400px
)。我需要 运行 的算法是:“最近邻插值法”。
在下图中,一个从像素 (1,1) 开始(左图,绿色像素)。我的比例因子是3。这意味着在我的输出图像中这个像素必须出现9次。
现在我的问题是,如何使用下面的代码(使用 2 个 for 循环)为每个绿色像素赋予 SourceImage
的值 (pixelValue)。
Input dimentions: width = 600px, height: 400px
Ouput dimentions: width = 1800px, height: 1200px
Scetch
OpenCL 代码
__kernel
void NearestNeighbourScaling(__read_only image2d_t SourceImage, __write_only image2d_t DestinationImage, int width, int height, int scalingFactor)
{
int row = get_global_id(0);
int col = get_global_id(1);
const int scaledWidth = width * scalingFactor;
const int scaledHeight = height * scalingFactor;
// Declaring sampler
const sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE | CLK_FILTER_LINEAR | CLK_ADDRESS_CLAMP;
float4 pixelValue = read_imagef(SourceImage, sampler, (int2)(col, row));
for(int i = 0; i < scalingFactor; i++)
{
for(int j = 0; j < scalingFactor; j++)
{
write_imagef(DestinationImage, (int2)(?, ?), pixelValue);
}
}
}
简而言之:进行最近邻插值的技巧是整数运算,或者在某些情况下是 float->integer casting。
对于您的情况,解决方案是 ??在双循环中是:
write_imagef(DestinationImage, (int2)(scalingFactor*col+i, scalingFactor*row+j), pixelValue);
这是如何工作的:对于每个 scalingFactor
xscalingFactor
像素,它设置与输入图像中的一个像素相同的颜色。输出图像中像素的 x 位置为 scalingFactor*col+i
,因此对于 scalingFactor=3
,这是 3*col+0
、3*col+1
、3*col+2
。如果 col=1
像图像中的绿色像素,这会导致 x 位置 3
、4
、5
全部被着色为绿色。 y方向作用相同。
计算位置时需要考虑缩放比例。您知道您要填写的字段将比原始字段大 n (scalingFactor) 倍。
这意味着首先您需要确保输出图像大小等于输入图像乘以缩放因子。
对于write_imagef(DestinationImage, (int2)(?, ?), pixelValue);
你还需要考虑位置的缩放。
对于您要执行此操作的行:
row * scalingFactor + i
对于您要执行相同操作的列,但使用 j。
write_imagef(DestinationImage, (int2)(row * scalingFacor + i, col * scalingsfactor + j), pixelValue);
我需要编写一个 OpenCL 内核。通过内核参数,我得到了一个具有特定维度的输入图像(例如:width: 600px, height: 400px
)。我需要 运行 的算法是:“最近邻插值法”。
在下图中,一个从像素 (1,1) 开始(左图,绿色像素)。我的比例因子是3。这意味着在我的输出图像中这个像素必须出现9次。
现在我的问题是,如何使用下面的代码(使用 2 个 for 循环)为每个绿色像素赋予 SourceImage
的值 (pixelValue)。
Input dimentions: width = 600px, height: 400px
Ouput dimentions: width = 1800px, height: 1200px
Scetch
OpenCL 代码
__kernel
void NearestNeighbourScaling(__read_only image2d_t SourceImage, __write_only image2d_t DestinationImage, int width, int height, int scalingFactor)
{
int row = get_global_id(0);
int col = get_global_id(1);
const int scaledWidth = width * scalingFactor;
const int scaledHeight = height * scalingFactor;
// Declaring sampler
const sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE | CLK_FILTER_LINEAR | CLK_ADDRESS_CLAMP;
float4 pixelValue = read_imagef(SourceImage, sampler, (int2)(col, row));
for(int i = 0; i < scalingFactor; i++)
{
for(int j = 0; j < scalingFactor; j++)
{
write_imagef(DestinationImage, (int2)(?, ?), pixelValue);
}
}
}
简而言之:进行最近邻插值的技巧是整数运算,或者在某些情况下是 float->integer casting。
对于您的情况,解决方案是 ??在双循环中是:
write_imagef(DestinationImage, (int2)(scalingFactor*col+i, scalingFactor*row+j), pixelValue);
这是如何工作的:对于每个 scalingFactor
xscalingFactor
像素,它设置与输入图像中的一个像素相同的颜色。输出图像中像素的 x 位置为 scalingFactor*col+i
,因此对于 scalingFactor=3
,这是 3*col+0
、3*col+1
、3*col+2
。如果 col=1
像图像中的绿色像素,这会导致 x 位置 3
、4
、5
全部被着色为绿色。 y方向作用相同。
计算位置时需要考虑缩放比例。您知道您要填写的字段将比原始字段大 n (scalingFactor) 倍。
这意味着首先您需要确保输出图像大小等于输入图像乘以缩放因子。
对于write_imagef(DestinationImage, (int2)(?, ?), pixelValue);
你还需要考虑位置的缩放。
对于您要执行此操作的行:
row * scalingFactor + i
对于您要执行相同操作的列,但使用 j。
write_imagef(DestinationImage, (int2)(row * scalingFacor + i, col * scalingsfactor + j), pixelValue);