第十四章 OpenGL ES-方框模糊(均值模糊)

本文介绍了OpenGLES中的方框模糊技术,包括其原理、3x3和5x5区域内的像素平均处理,以及如何在GLSL中实现竖直和水平的均值模糊,展示了在OpenGL中使用GLSL代码实现模糊效果的过程。
摘要由CSDN通过智能技术生成

第十四章 OpenGL ES-方框模糊(均值模糊)

第一章 OpenGL ES 基础-屏幕、纹理、顶点坐标
第二章 OpenGL ES 基础-GLSL语法简单总结
第三章 OpenGL ES 基础-GLSL渲染纹理
第四章 OpenGL ES 基础-位移、缩放、旋转原理
第五章 OpenGL ES 基础-透视投影矩阵与正交投影矩阵
第六章 OpenGL ES 基础-FBO、VBO理解与运用
第七章 OpenGL ES 基础-输入输出框架思维
第八章 OpenGL ES 基础-MVP矩阵理解
第九章 OpenGL ES 基础-高斯模糊原理
第十章 OpenGL ES 基础-图像USM锐化
第十一章 OpenGL ES 基础-基础光照
第十二章 OpenGL ES 基础-色温、色调、亮度、对比度、饱和度、高光
第十三章 OpenGL ES-RGB、HSV、HSL模型介绍
第十四章 OpenGL ES-方框模糊(均值模糊)
第十五章 OpenGL ES-VR 全景模式原理
第十六章 OpenGL ES-桶形畸变算法-常用VR

方框模糊(Box Blur)原理

方框模糊(Box Blur)是一种基本的图像模糊算法,其原理比较简单。在应用方框模糊时,对于每个像素,取周围一个固定大小的区域(比如3x3或5x5),然后计算该区域内所有像素的平均值,并将这个平均值赋给当前像素。这样做会使图像中的细节减少,从而产生一种模糊效果。

方框模糊的原理并不复杂,但由于对每个像素都要进行计算,因此它可能会导致图像处理速度变慢。虽然方框模糊效果比较简单,但在某些场景下,它仍然可以被用来减轻图像噪点或者增加视觉效果。

下图按3x3为例子进行说明
在这里插入图片描述
使用3x3采样方法遍历每一个像素点,以左上角的像素块为例,它的RGB色值为(75,75,194),因为是边缘色块,相对它(左上角)只有右下角色值为RGB(153,75,194)一个色块,那模糊后的色值计算方法(四舍五入取整数值)为:
R = (75+75+75+153)/ 9 = 42

G = (75+117+194+75)/9 = 51

B = (194+194+125+194)/9 = 79

它模糊后的最终色值为RGB(67,18,48)

如果以左上图的中心颜色块为像素点(153,75,194),以改点中心周围的8个像素按3x3的进行每个点像素颜色相加取均值,那模糊后的色值计算方法(四舍五入取整数值)为:

R = (75+75+75+75+153+194+190+194+78)/ 9

G = (75+117+173+194+75+75+194+75+194)/9

B = (194+194+194+125+194+145+75+106+75)/9 = 79

GLSL的实现-竖直和水平的均值模糊

texture是图片的纹理,vTexCoord图片的纹理坐标,texelWidthOffse、texelHeightOffsett对应图片的宽比的1/width和高比的1/texelHeightOffset,BlurKernelSize对应模糊做均值的数量,BlurDirection判断做水平模糊、还是竖直模糊,下面的代码分开竖直和水平的均值模糊

uniform sampler2D texture;
varying vec2 vTexCoord;
uniform float texelWidthOffset;
uniform float texelHeightOffset;

uniform float BlurKernelSize;// = 3.0;//3.0 or 5
uniform int   BlurDirection;// = 1;// 1.0 or 0
vec4 BoxBlur(int blurKernelSize, vec2 blurRadius, sampler2D texSampler, vec2 texCoord)
{
      vec4 sumValue = vec4(0.0);
      vec2 texCoord2;
      float count = 0.0;

      for (int i = -blurKernelSize; i <= blurKernelSize; i++) {
            texCoord2 = texCoord + blurRadius * float(i);
            
            sumValue += texture2D(texSampler, texCoord2);
            count += 1.0;
      }
      sumValue = sumValue / count;
      return sumValue;
}

void main()
{
    vec2 blurDir = vec2(1.0,0.0);
    if(BlurDirection!=0) blurDir = vec2(0.0,1.0);
    vec2 invSize = vec2(texelWidthOffset,texelHeightOffset);
    vec2 blurRadius = invSize * blurDir;
    gl_FragColor = BoxBlur(int(BlurKernelSize), blurRadius, texture, vTexCoord);
}


attribute vec4 position;
attribute vec2 texCoord;
varying vec2 vTexCoord;

void main()
{
    gl_Position = position;
    vTexCoord = texCoord.xy;
}

按上面的GLSL进行OpenGL实现,出来效果
在这里插入图片描述

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baoyu45585

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值