高斯模糊网上例子很多,可是找了一下发现都是没有动态计算权重矩阵数组的,基本是把权重矩阵写死了

公式我就不说了,网上很多,只是没有发现权重矩阵的计算代码,根据网上的公式的推导代码

float a = (float) ((1.0f / 2.0f * Math.PI * Math.pow(sigma, 2.0f)) * Math.exp(-s / (2.0f * Math.pow(sigma, 2.0f))));

sigma是公式内的σ

公式有了接下来就是计算权重矩阵了

public void gaussianWeights(){if(blurRadius == 0 || sigma == 0){return;}float sumOfWeights = 0.0f;int g = 0;int tx = blurRadius*2+1;float gaussianWeights[] = new float[tx*tx];for (int x = -blurRadius; x <= blurRadius; x++) {for (int y = -blurRadius; y <= blurRadius; y++) {int s = x*x+y*y;float a = (float) ((1.0f / 2.0f * Math.PI * Math.pow(sigma, 2.0f)) * Math.exp(-s / (2.0f * Math.pow(sigma, 2.0f))));gaussianWeights[g] = a;sumOfWeights+=a;g++;}}for (int x = 0; x < tx*tx; ++x) {gaussianWeights[x] = gaussianWeights[x]/sumOfWeights;}gaussianWeightsBuffer = ByteBuffer.allocateDirect(gaussianWeights.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer().put(gaussianWeights);gaussianWeightsBuffer.position(0);}

blurRadius是模糊半径,当是1的时候就是一个3x3的矩阵,2的时候是5x5的矩阵,以此类推,这样就能计算出权重矩阵的长度了

通过公式计算出来的数是大于1的数,而权重矩阵的总和是1,所以每个单位要除以总和

这样就能得到想要的权重矩阵了

我想应该有人发现我现在的代码都是java代码,而不是opengles的glsl代码,因为glsl代码是用来计算每一个像素的,不适合嵌套循环,如果放在glsl代码内,那一张100x100的图片计算3x3的权重矩阵就要进行100x100x3x3次计算,当图片大或者权重矩阵大的时候的计算量。。

所以提出来放在cpu内进行循环,blurRadius=10的时候执行时间也才1毫秒左右,而且每次渲染只执行一次

既然算出了矩阵那就要把它传到glsl内,所以要用到我上一篇文章了Android opengles 传数组给shader着色器

这是效果

sigma,blurRadius和图片尺寸都会影响模糊效果

GitHub

Android opengles 动态调节高斯模糊相关推荐

  1. 实现背景动态化android,Android TV 动态设置背景的高斯模糊

    导语: 用过小米电视的小伙伴都知道,高斯模糊在小米上得到了广泛的运用,比如小米电视的设置界面.那么什么是高斯模糊,怎么样做高斯模糊,这篇文章给你揭晓. 什么是高斯模糊 高斯模糊(英语:Gaussian ...

  2. 《Android 美颜类相机开发汇总》第五章 Android OpenGLES 美颜定制实现

    在介绍美颜定制之前,我们先来复习一下OpenGL中图像绘制原理.OpenGL的图像绘制,是由许许多多三角形构成的.OpenGL的绘制离不开三角形的绘制.通常对于不需要对图像细节进行处理的时候,我们一般 ...

  3. Android opengles 实现触碰屏幕,根据运动轨迹画直线的功能

    Android opengles 实现触碰屏幕,根据运动轨迹画直线的功能 目录 引言 第一步,先自己学会绘制一条固定坐标的直线 第二步,动态的绘制一条直线 第三步,坐标转换 第四步,绘制多条直线 代码 ...

  4. Android类动态加载技术

    Android类动态加载技术 Android应用开发在一般情况下,常规的开发方式和代码架构就能满足我们的普通需求.但是有些特殊问题,常常引发我们进一步的沉思.我们从沉思中产生顿悟,从而产生新的技术形式 ...

  5. Android apk动态加载机制的研究(二):资源加载和activity生命周期管理

    转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/23387079 (来自singwhatiwanna的csdn博客) 前言 为了 ...

  6. android动态获取输入值,Android实现动态自动匹配输入内容

    Android实现动态自动匹配的控件主要有MultiAutoCompleteTextView和AutoCompleteTextView MultiAutoCompleteTextView: 可支持选择 ...

  7. 【开源项目----Android OPenGLES渲染YUV视频文件】

    [开源项目----Android OPenGLES渲染YUV视频文件] OpenGLES对YUV渲染相关文章参考

  8. 可动态调节参数的线程池实现

    背景 线程池是一种基于池化思想管理线程的工具,使用线程池可以减少创建销毁线程的开销,避免线程过多导致系统资源耗尽.在高并发的任务处理场景,线程池的使用是必不可少的.在双11主图价格表达项目中为了提升处 ...

  9. android studio 导入包分不分动态静态,详解Android studio 动态fragment的用法

    fragment的使用时Android的基础,它有两种用法,第一个就是静态的fragment.第二个则是动态的fragment. 静态fragment直接在layout创建你想要的fragment的X ...

最新文章

  1. Linux进程控制——exec函数族
  2. C++ 20 是近十年来影响最大的一个版本,新的特性众多
  3. C++中一个容易被忽视的名字查找规则
  4. 使程序不显示在任务栏上
  5. 十大建筑中的数学之美
  6. mongodb对数组元素及内嵌文档进行增删改查操作(转)
  7. 如何做WP的登录/注册功能
  8. 利用bug来进行调试
  9. Android 自动更新之状态栏下载状态和进度
  10. java工程师什么城市就业_热门城市的Java薪资情况
  11. iso中应用外部资源
  12. 2020离散数学系列
  13. 黑马程序员最新版JavaWeb综合案例(前后端完整版)
  14. 明尼苏达双城大学计算机排名,明尼苏达大学双城分校排名
  15. 【BSP视频教程】STM32H7视频教程第4期:从启动到运行过程全解析,电源域,复位,时钟,软硬件启动流程到堆栈,map和htm文件分析(2022-01-26)
  16. DNS劫持、流量劫持,HTTP/HTTPS劫持
  17. CAD 坐标转经纬度(Arcgis)
  18. C++进阶笔记001:static 静态生存期 和 动态生存期
  19. java 登陆短信验证码_Java实现短信验证码
  20. Linux树莓派开发——配置树莓派内核源码,内核编译,更换树莓派Linux内核

热门文章

  1. 密码学与网络安全课程习题集及参考答案(一些思考题)
  2. Mouse without Borders 让键盘和鼠标飞起来
  3. Python Matplotlib设置x轴与y轴相交于心仪的坐标点
  4. 这是怎么回事,我的泰拉瑞亚游戏启动不了了
  5. 编译出现错误:incomplete type ‘WebsocketSession’ used in nested name specifier。
  6. 据结构学习(冒泡、选择、插入、快速排....
  7. 【CSS】css文字超出显示省略号/文字超过三行显示省略号..
  8. Typhon之异常错误克星TLSException
  9. 【产品】项目管理的五大阶段
  10. Git 核心概念:工作区与暂缓区(添加提交及查看状态充分体现)