OpenGL高斯模糊
高斯模糊
- 简介
- 描述
- 高斯分布
- 高斯函数
- 模糊半径
- 卷积运算
- 卷积核
- 原图像
- 卷积结果
- 细节
- 高斯函数卷积核
- 实现
- Python计算卷积核
- OpenGL卷积核实现
- OpenGL高斯模糊优化
简介
描述
高斯模糊:使用高斯函数求出的值来作为卷积核进行图像的卷积运算。
卷积核总结:
- 对图像进行降维以及特征提取,一般用于人工智能。
- 行数和列数均为奇数的矩阵。
- 卷积核元素的总和体现出输出的亮度。
高斯分布
f(x)=12πσ2e−(x−μ)22σ2f(x)=\frac{1}{\sqrt{2\pi\sigma^2}} {e^{-\frac{(x-\mu)^2}{2\sigma^2}}} f(x)=2πσ21e−2σ2(x−μ)2
高斯函数
G(r)=12πσ2Ne−r22σ2G(r)=\frac{1}{\sqrt{2\pi\sigma^2}^{N}} {e^{-\frac{r^2}{2\sigma^2}}} G(r)=2πσ2N1e−2σ2r2
σ\sigmaσ是正态函数的标准差, rrr代表模板中元素到模板中心的距离,又称为模糊半径, NNN代表处于NNN维空间。
模糊半径
定义:欧式距离(N维向量的模)。
欧几里得度量(euclidean metric)也称欧氏距离,是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。
卷积运算
卷积核
原图像
卷积结果
从原图像中提取与卷积同等大小的矩阵与卷积核进行矩阵相乘运算。
6=(0−2+0)+(−2+20−8)+(0−2+0)6=(0-2+0)+(-2+20-8)+(0-2+0) 6=(0−2+0)+(−2+20−8)+(0−2+0)
细节
卷积处理后,图像的每条边少了一个像素。
解决:将已有的点拷贝到另一面的对应位置,也就是填充边。
高斯函数卷积核
假设σ=1.5\sigma=1.5σ=1.5,高斯卷积核如下。
实现
Python计算卷积核
import mathpi = 3.1415926
sigma = 1.5
e = 2.7182804def G(r):return (1 / pow(math.sqrt(2 * pi * pow(sigma, 2)), 2)) * pow(e, -((r*r) / (2 * pow(sigma, 2))))print("G(2) = %.7f" % G(2)) # G(2) = 0.0290803
print("G(1) = %.7f" % G(1)) # G(1) = 0.0566406
print("G(0) = %.7f" % G(0)) # G(0) = 0.0707355
OpenGL卷积核实现
#iChannel0 "file://images/img.jpg" // 与shader脚本文件在同级目录下// 高斯函数用到的常量
const float pi = 3.1415926;
const float sigma = 1.5;
const float e = 2.7182804;// 高斯函数, r为欧式距离
float G(float r) {return (1.0 / pow(sqrt(2.0 * pi * pow(sigma, 2.0)), 2.0)) * pow(e, -((r*r) / (2.0 * pow(sigma, 2.0))));
}// 主函数
void mainImage(out vec4 fragColor, in vec2 fragCoord) {// 计算uv, iResolution.xy是screen大小vec2 uv = fragCoord.xy / iResolution.xy;// 模拟像素vec2 pixed = 2.0 / iResolution.xy;// 相邻像素的uvvec2 texcoords[9];texcoords[0] = uv + vec2(-1.0, -1.0) * pixed;texcoords[1] = uv + vec2(0.0, -1.0) * pixed;texcoords[2] = uv + vec2(1.0, -1.0) * pixed;texcoords[3] = uv + vec2(-1.0, 0.0) * pixed;texcoords[4] = uv + vec2(0.0, 0.0) * pixed;texcoords[5] = uv + vec2(1.0, 0.0) * pixed;texcoords[6] = uv + vec2(-1.0, 1.0) * pixed;texcoords[7] = uv + vec2(0.0, 1.0) * pixed;texcoords[8] = uv + vec2(1.0, 1.0) * pixed;// 相邻像素对应的权重, 卷积核float w[9];w[0] = w[2] = w[6] = w[8] = G(2.0);w[1] = w[3] = w[5] = w[7] = G(1.0);w[4] = G(0.0);// 权重总和, 用来归一化卷积核float totalWeight = w[0] * 4.0 + w[1] * 4.0 + w[4];// 卷积运算vec4 gaussColor = vec4(0.0);for (int i = 0; i < 9; i++) {gaussColor += texture2D(iChannel0, texcoords[i]) * w[i] / totalWeight;}// 原图vec4 originalColor = texture2D(iChannel0, uv);// sin + time动态变化float normalTime = abs(sin(iTime));// mix输出颜色fragColor = mix(originalColor, gaussColor, normalTime);
}
OpenGL高斯模糊优化
优化点:
- 在片元着色器会重复计算卷积核,比较耗时;可以放在CPU计算,传给shader。
- 3×33 \times 33×3卷积就需要在片元中纹理采样9次,可以降低为6次。
- 先进行横向模糊,采样3次,存储横向结果texture。
- 横向结果texture再进行纵向模糊,采样3次。
OpenGL高斯模糊相关推荐
- OpenGL实现高斯模糊
需要的话可以看看这篇文章 简单概括: 区别于直接对区域内所有像素的颜色做平均,利用高斯函数曲线(正态分布)的最高点作为当前像素的权重,相邻像素权重根据曲线递减.这样就可以实现距离当前像素越近的像素权重 ...
- 安卓平台基于opengl es的 高斯模糊 效果
添加依赖 模块gradle dependencies { ...implementation 'com.github.k4ttt:ZGlTest:1.0.0' } 项目gradle allprojec ...
- [转]HDR渲染器的实现(基于OpenGL)
http://dev.gameres.com/Program/Visual/3D/HDRTutorial/HDRTutorial.htm 作者:何咏(欢迎和大家交流,我的QQ:35574585,Ema ...
- NeHe OpenGL教程 第三十六课:从渲染到纹理
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- OpenGL 泛光Bloom
OpenGL 泛光Bloom 泛光Bloom简介 提取亮色 高斯模糊 把两个纹理混合 泛光Bloom简介 明亮的光源和区域经常很难向观察者表达出来,因为监视器的亮度范围是有限的.一种区分明亮光源的方式 ...
- cocos中如何让背景模糊_cocos2dx-js Shader的使用(高斯模糊)
编程之家收集整理的这篇文章主要介绍了cocos2dx-js Shader的使用(高斯模糊),编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考. 可以参考http://blog.csdn.ne ...
- OpenGL基础54:点光源阴影
前置: OpenGL基础53:阴影映射(下) 一.万象阴影贴图 之前成功实现了平行光阴影,生成阴影贴图时使用的矩阵是正交矩阵,若是想要实现点光源的阴影效果,那么理论上只需要修改投影矩阵为透视矩阵就好了 ...
- OpenGL基础51:泛光
一.泛光(Bloom) 如果一个物体的颜色值接近1.0,怎么确定它是否是光源呢?毕竟一张白纸它的颜色也可以是1.0 在此之前,分辨光源往往都是靠的经验,例如你知道这个物体它是个路灯,又或者说根据周围的 ...
- OpenGL基础50:HDR
一.HDR与LDR 由于显示器只能显示值为0.0到1.0间的颜色,因此当数据存储在帧缓冲(Framebuffer)中时,亮度和颜色的值也是默认被限制在0.0到1.0之间的,这个颜色范围即是LDR(Lo ...
最新文章
- Android 资源保护问题——探索
- c语言写贪吃蛇什么水平_学了一些C语言,也不知道自己学到什么程度,自己想写个贪吃蛇但是写不出来,想看懂下面这个程序,求解释...
- .Net - Lambda 表达式
- 【LeetCode从零单排】No36	Valid Sudoku
- 台湾大学林轩田机器学习基石课程学习笔记10 -- Logistic Regression
- js操作元素节点对象value
- 编程之美 - 哪个题目最美?
- zookeeper伪集群部署
- OpenCV-Mat笔记
- MATLAB中的线性插值
- python机器学习案例系列教程——K最近邻算法(KNN)、kd树
- go程序设计语言-前言
- PyQt5|PySide2 UI界面内嵌web浏览器的方法
- 查看EXE/DLL文件是32/64位之通用方法
- 企业图纸无纸化,企业图纸安全使用和传输解决方案
- 如何使用patch命令打补丁
- Android颜色透明度(不透明度)
- 【号外】马云这次帮了大忙,银行卡再也不用怕被盗刷!
- 虹科教您|实现OPC UA C/S快速部署及数据采集
- Windows常用Dos命令详解_被迫流浪者的博客
热门文章
- 在springboot中使用h2数据库
- NUC970开发资源
- 版本控制工具 svn 一
- [luoguP1773] 符文之语_NOI导刊2010提高(02)(DP)
- Swift - 类型属性(类静态属性)和类方法(类静态方法)
- (二)在.net中如何使用Memcached
- 链接和作用域2 - C++快速入门43
- After paper reading.......
- 编程方法学22:NameSurfer概述
- Python学习笔记:访问数据库