Graphics 有人知道我在哪里可以找到双边过滤器(模糊)的glsl实现吗?

Graphics 有人知道我在哪里可以找到双边过滤器(模糊)的glsl实现吗?,graphics,opengl-es,Graphics,Opengl Es,我想在GPU上做“选择性模糊”或“表面模糊”。我读过一些关于这个主题的研究论文,也看过很多C代码,但理想情况下我想要GLSL、HSL或CG中的代码 实际上,双边模糊与高斯模糊没有太大区别,只需将采样值乘以高斯因子,再乘以中心像素和采样像素的实际值之间的“贴近度”函数的结果即可 所以,在pseude GLSL中 vec3 centreColour = texture2D(image,texCoord); vec3 result = centreColour; float normalization

我想在GPU上做“选择性模糊”或“表面模糊”。我读过一些关于这个主题的研究论文,也看过很多C代码,但理想情况下我想要GLSL、HSL或CG中的代码

实际上,双边模糊与高斯模糊没有太大区别,只需将采样值乘以高斯因子,再乘以中心像素和采样像素的实际值之间的“贴近度”函数的结果即可

所以,在pseude GLSL中

vec3 centreColour = texture2D(image,texCoord);
vec3 result = centreColour;
float normalization = 1;
for (int i = 0; i < NUM_SAMPLES; ++1)
{
   vec3 sample = texture2D(image, texCoord + offsets[i]);
   float gaussianCoeff = computeGaussianCoeff(offsets[i]);

   //depends on your implementation, this is quick
   float closeness = 1.0f - distance(sample,centreColour) / length(vec3(1,1,1));

   float sampleWeight = closeness * gaussian;

   result += sample * sampleWeight;
   noralization += sampleWeight;
}
vec3 bilateral = result / normalization;
vec3 centreColour=texture2D(图像,texCoord);
vec3结果=中心颜色;
浮点归一化=1;
对于(int i=0;i
您可能应该有更好的方法来确定贴近度值,例如在感知均匀的空间(如LUV)中进行确定

对于优化,您可以应用所有适用于高斯模糊的技术,除了那些忽略您必须知道像素值这一事实的技术。例如,使用纯高斯,您可以明智地选择texcoords,并在一次提取中集成4个像素。这是行不通的

能起作用的大事:

*分离你的过滤器。代替5x5个样本(25),水平5次,保存到中间缓冲区,垂直5次。看起来不完全一样,但仍然可以去除噪音


*以较低的分辨率执行过滤器,并将其与原始信号合成,以获得一些详细信息。

对于来到这里的任何人,如果您不自己重新实现,则在中有一个完整的实现


该实现包括顶点着色器和片段着色器。

谢谢,这比我读到的大多数内容更容易理解,也谢谢关于优化方面我能做什么和不能做什么的提示。我将看看是否可以将其转换为Quartz Composer示例。为了澄清,我的目标是在保持d的同时平滑图像边缘细节。这正是双边所做的,它在保持细节的同时去除噪音。这也是我在photoshopping时的最爱:)刚刚偶然发现这篇文章,我想我应该链接到两个简单的QC实验,进行双边过滤:优化2D高斯模糊的最常见方法之一是利用注意,这并不适用于双边模糊。接近度的线应该是“浮动接近度=1.0-距离(样本,中心颜色)/长度(vec3(1,1,1));“相反,还是我遗漏了什么?随着颜色的不同,重量应该会变小,对吗?”?