任何人都知道我在哪里可以找到双边滤镜(模糊)的glsl实现?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了任何人都知道我在哪里可以找到双边滤镜(模糊)的glsl实现?相关的知识,希望对你有一定的参考价值。
我想在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;
您可能应该有更好的方法来确定接近度值,例如在LUV等感知均匀的空间中进行测量。
为了优化,您可以应用所有适用于高斯模糊的技术,除了忽略您必须知道像素值的事实。例如,使用纯高斯,你可以明智地选择你的texcoords并在一次获取中集成4个像素。那不行。
做的大事:
*分离您的过滤器。而不是5x5样本(25),水平做5,保存到中间缓冲区,垂直做5。它看起来不完全一样,但它仍然会消除噪音。
*以较低的分辨率执行滤镜,并将其与原始分辨率合成以获得一些细节。
另一答案
对于任何到达这里的人来说,如果你没有自己重新实现,那么GPUImageView for Android就有了完全实现。
实现包括顶点着色器和片段着色器。
以上是关于任何人都知道我在哪里可以找到双边滤镜(模糊)的glsl实现?的主要内容,如果未能解决你的问题,请参考以下文章
模糊处理(下)--高斯模糊,双边模糊以及实现一个简单的磨皮美颜效果(opencv学习记录--4)
我在哪里可以找到 Fluent NHibernate 教程?