Android opengles 动态调节高斯模糊

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

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

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

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值