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

时间:2014-04-24 09:57:19

标签: opengl image-processing filter

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

目前我们有一个代码,用于计算指定位置列表中的“输出强度” x1,y1, x2,y2, ..., xn,yn 将Lanczos2滤镜应用于输入图像。目前的位置数量是20(实际上是视觉假体中的光学位置列表),但最终会增加到256,GPU处理肯定会加速。无法对硬盘进行硬编码。

到目前为止,我已经看到了如何实现中值滤波器和类似的,但在我的情况下,不需要在每个图像像素处计算滤波器内核的卷积,只需在指定的位置。

2 个答案:

答案 0 :(得分:0)

处理具有样本或非位的第二个纹理中的这些值(强度)。

答案 1 :(得分:0)

如果您使用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)); 
}

步骤的简要说明 1.计算3x3邻域中源像素周围的像素值的平均值; 2.找到同一邻域中小于均值的所有像素的最大像素值。 3. [可选]从源像素值中减去中值像素值以进行边缘检测。

如果您使用中值进行边缘检测,有几种方法可以修改上述代码以获得更好的结果,即混合中值滤波和截断媒体滤波(替代品和更好的&#39) ;模式&#39;过滤)。如果您有兴趣,请询问。