高斯模糊

  • 简介
    • 描述
    • 高斯分布
    • 高斯函数
      • 模糊半径
      • 卷积运算
        • 卷积核
        • 原图像
        • 卷积结果
        • 细节
      • 高斯函数卷积核
  • 实现
    • Python计算卷积核
    • OpenGL卷积核实现
    • OpenGL高斯模糊优化

简介

描述

高斯模糊:使用高斯函数求出的值来作为卷积核进行图像的卷积运算。

卷积核总结

  1. 对图像进行降维以及特征提取,一般用于人工智能。
  2. 行数和列数均为奇数的矩阵。
  3. 卷积核元素的总和体现出输出的亮度。

高斯分布


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πσ2​1​e−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πσ2​N1​e−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次。
    1. 先进行横向模糊,采样3次,存储横向结果texture。
    2. 横向结果texture再进行纵向模糊,采样3次。

OpenGL高斯模糊相关推荐

  1. OpenGL实现高斯模糊

    需要的话可以看看这篇文章 简单概括: 区别于直接对区域内所有像素的颜色做平均,利用高斯函数曲线(正态分布)的最高点作为当前像素的权重,相邻像素权重根据曲线递减.这样就可以实现距离当前像素越近的像素权重 ...

  2. 安卓平台基于opengl es的 高斯模糊 效果

    添加依赖 模块gradle dependencies { ...implementation 'com.github.k4ttt:ZGlTest:1.0.0' } 项目gradle allprojec ...

  3. [转]HDR渲染器的实现(基于OpenGL)

    http://dev.gameres.com/Program/Visual/3D/HDRTutorial/HDRTutorial.htm 作者:何咏(欢迎和大家交流,我的QQ:35574585,Ema ...

  4. NeHe OpenGL教程 第三十六课:从渲染到纹理

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  5. OpenGL 泛光Bloom

    OpenGL 泛光Bloom 泛光Bloom简介 提取亮色 高斯模糊 把两个纹理混合 泛光Bloom简介 明亮的光源和区域经常很难向观察者表达出来,因为监视器的亮度范围是有限的.一种区分明亮光源的方式 ...

  6. cocos中如何让背景模糊_cocos2dx-js Shader的使用(高斯模糊)

    编程之家收集整理的这篇文章主要介绍了cocos2dx-js Shader的使用(高斯模糊),编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考. 可以参考http://blog.csdn.ne ...

  7. OpenGL基础54:点光源阴影

    前置: OpenGL基础53:阴影映射(下) 一.万象阴影贴图 之前成功实现了平行光阴影,生成阴影贴图时使用的矩阵是正交矩阵,若是想要实现点光源的阴影效果,那么理论上只需要修改投影矩阵为透视矩阵就好了 ...

  8. OpenGL基础51:泛光

    一.泛光(Bloom) 如果一个物体的颜色值接近1.0,怎么确定它是否是光源呢?毕竟一张白纸它的颜色也可以是1.0 在此之前,分辨光源往往都是靠的经验,例如你知道这个物体它是个路灯,又或者说根据周围的 ...

  9. OpenGL基础50:HDR

    一.HDR与LDR 由于显示器只能显示值为0.0到1.0间的颜色,因此当数据存储在帧缓冲(Framebuffer)中时,亮度和颜色的值也是默认被限制在0.0到1.0之间的,这个颜色范围即是LDR(Lo ...

最新文章

  1. Android 资源保护问题——探索
  2. c语言写贪吃蛇什么水平_学了一些C语言,也不知道自己学到什么程度,自己想写个贪吃蛇但是写不出来,想看懂下面这个程序,求解释...
  3. .Net - Lambda 表达式
  4. 【LeetCode从零单排】No36 Valid Sudoku
  5. 台湾大学林轩田机器学习基石课程学习笔记10 -- Logistic Regression
  6. js操作元素节点对象value
  7. 编程之美 - 哪个题目最美?
  8. zookeeper伪集群部署
  9. OpenCV-Mat笔记
  10. MATLAB中的线性插值
  11. python机器学习案例系列教程——K最近邻算法(KNN)、kd树
  12. go程序设计语言-前言
  13. PyQt5|PySide2 UI界面内嵌web浏览器的方法
  14. 查看EXE/DLL文件是32/64位之通用方法
  15. 企业图纸无纸化,企业图纸安全使用和传输解决方案
  16. 如何使用patch命令打补丁
  17. Android颜色透明度(不透明度)
  18. 【号外】马云这次帮了大忙,银行卡再也不用怕被盗刷!
  19. 虹科教您|实现OPC UA C/S快速部署及数据采集
  20. Windows常用Dos命令详解_被迫流浪者的博客

热门文章

  1. 在springboot中使用h2数据库
  2. NUC970开发资源
  3. 版本控制工具 svn 一
  4. [luoguP1773] 符文之语_NOI导刊2010提高(02)(DP)
  5. Swift - 类型属性(类静态属性)和类方法(类静态方法)
  6. (二)在.net中如何使用Memcached
  7. 链接和作用域2 - C++快速入门43
  8. After paper reading.......
  9. 编程方法学22:NameSurfer概述
  10. Python学习笔记:访问数据库