使用 OpenCL 内核的最近邻插值代码

Posted

技术标签:

【中文标题】使用 OpenCL 内核的最近邻插值代码【英文标题】:Nearest Neigbour Interpolation code using OpenCL kernel 【发布时间】:2022-01-16 22:49:52 【问题描述】:

我需要编写一个 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

草图

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);
        
    

【问题讨论】:

【参考方案1】:

简而言之:进行最近邻插值的技巧是整数算术,或者在某些情况下使用浮点->整数转换。

在您的情况下,解决方案 ??在双循环中是:

write_imagef(DestinationImage, (int2)(scalingFactor*col+i, scalingFactor*row+j), pixelValue);

这是如何工作的:对于每个scalingFactorxscalingFactor 像素,它设置与输入图像中的一个像素相同的颜色。输出图像中像素的 x 位置是scalingFactor*col+i,所以对于scalingFactor=3,这是3*col+03*col+13*col+2。如果col=1 像图像中的绿色像素一样,这会导致x 位置345 都被涂成绿色。 y 方向的工作原理相同。

【讨论】:

【参考方案2】:

在计算位置时,您需要考虑缩放比例。您知道要填写的字段将比原始字段大 n (scalingFactor) 倍。

这意味着首先您需要确保输出图像大小等于输入图像乘以缩放因子。

对于write_imagef(DestinationImage, (int2)(?, ?), pixelValue);,您还需要考虑位置的缩放。

对于您要执行此操作的行: row * scalingFactor + i 表示您想要执行相同操作但使用 j 的列。

write_imagef(DestinationImage, (int2)(row * scalingFacor + i, col * scalingsfactor + j), pixelValue);

【讨论】:

以上是关于使用 OpenCL 内核的最近邻插值代码的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Matlab 通过最近邻插值旋转图像

对颤振图像使用最近邻插值

用最近邻插值(Nearest Neighbor interpolation)进行图片缩放

使用 R 中的最近邻分类器分配类标签

机器视觉学习笔记最近邻插值实现图片任意角度旋转(C++)

使用树来加速具有周期性边界条件的 3D 阵列上的最近邻搜索