Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用OpenGL对图像进行不规则采样_Opengl_Image Processing_Filter - Fatal编程技术网

使用OpenGL对图像进行不规则采样

使用OpenGL对图像进行不规则采样,opengl,image-processing,filter,Opengl,Image Processing,Filter,我正在寻找一些关于如何使用OpenGL在指定位置列表中对图像进行采样的指针。有类似于下面问题的教程或示例的链接吗 目前,我们有一个代码,用于计算指定位置列表处的“输出强度”x1、y1、x2、y2、…、xn、yn对输入图像应用Lanczos2滤波器。目前位置的数量是20个(实际上是视觉假肢中的磷化氢位置列表),但最终会增加到256个,GPU处理肯定会加快速度。位置列表不能硬编码 到目前为止,我已经了解了如何实现中值滤波器等,但在我的例子中,不需要在每个图像像素处计算滤波器内核的卷积,只需在指定的位

我正在寻找一些关于如何使用OpenGL在指定位置列表中对图像进行采样的指针。有类似于下面问题的教程或示例的链接吗

目前,我们有一个代码,用于计算指定位置列表处的“输出强度”
x1、y1、x2、y2、…、xn、yn
对输入图像应用Lanczos2滤波器。目前位置的数量是20个(实际上是视觉假肢中的磷化氢位置列表),但最终会增加到256个,GPU处理肯定会加快速度。位置列表不能硬编码


到目前为止,我已经了解了如何实现中值滤波器等,但在我的例子中,不需要在每个图像像素处计算滤波器内核的卷积,只需在指定的位置。

在第二个纹理中处理这些值(浓度),该纹理具有采样或非采样位。

如果使用OpenGL,您将能够定义ROI(感兴趣区域),如您所述,要对其应用编辑或处理的图像部分

如果您选择该路线,这就是使用OpenGL ES 2.0/3.0计算所选像素邻域半径中值的方法:

kernel vec4 medianUnsharpKernel(sampler u) {
vec4 pixel = unpremultiply(sample(u, samplerCoord(u)));
vec2 xy = destCoord();
int radius = 3;
int bounds = (radius - 1) / 2;
vec4 sum  = vec4(0.0);
for (int i = (0 - bounds); i <= bounds; i++)
{
    for (int j = (0 - bounds); j <= bounds; j++ )
    {
        sum += unpremultiply(sample(u, samplerTransform(u, vec2(xy + vec2(i, j)))));
    }
}
vec4 mean = vec4(sum / vec4(pow(float(radius), 2.0)));
float mean_avg = float(mean);
float comp_avg = 0.0;
vec4 comp  = vec4(0.0);
vec4 median  = mean;
for (int i = (0 - bounds); i <= bounds; i++)
{
    for (int j = (0 - bounds); j <= bounds; j++ )
    {
        comp = unpremultiply(sample(u, samplerTransform(u, vec2(xy + vec2(i, j)))));
        comp_avg = float(comp);
        median = (comp_avg < mean_avg) ? max(median, comp) : median;
    }
}

return premultiply(vec4(vec3(abs(pixel.rgb - median.rgb)), 1.0)); 
}
kernelvec4内核(采样器u){
vec4像素=不加乘法(采样(u,采样坐标(u));
vec2 xy=destCoord();
int半径=3;
int边界=(半径-1)/2;
vec4总和=vec4(0.0);

对于(inti=(0-bounds),我指的是OpenGL或OpenCL(或CUDA)?如果您没有与OpenGL渲染等严格相关的任务,则后一个可能更好。仅限OpenGL。OpenGL ES 2.0将是理想的。您的目标是创建一个新图像,使用这些位置作为每个像素的偏移量从原始图像重新采样吗?目标是创建一个阵列,该阵列在采样位置具有输出强度,我无法重新采样ally了解您希望如何利用使用GPU仅返回图像中特定位置的值的好处。图像是否已在GPU内存中?生成的数组是否会被GPU上运行的某个对象使用?如果第一个问题的答案为“否”然后,将整个图像加载到GPU内存中,仅仅使用相对较少的值,就不会得到任何结果。