zoukankan      html  css  js  c++  java
  • 【转】三、android图片特效处理之锐化效果

    这篇将讲到图片特效处理的锐化效果。跟前面一样是对像素点进行处理,算法是通用的。

    算法原理:

    一、简单算法:分别获取当前像素点和八个周围像素点的RGB值,先求出当前像素点的RGB值与八个像素点RGB值的和的平均数,再乘以相应的系数,然后在与当前像素点之和。

    例:

    ABC

    DEF

    GHI

    对E点进行锐化:

    float delta = 0.3;
    E.r = (E.r - (A.r + B.r + C.r + D.r + F.r + G.r + H.r + I.r) / 8) * delta + E.r;

    E.g,E.b类似,delta建议取0.3,具体多少无所谓,试一下就知道了。但按照上面原理,没有达到预期的效果,改变delta的值也不行,所以后面代码就不贴出来了,感兴趣的可以研究一下。

    二、拉普拉斯变换:将拉普拉斯矩阵中的项与相应点的RGB值之积再乘以相应的系数的和作为当前点的RGB值。

    例:用上面的例子,还是对E点进行锐化。

    // 拉普拉斯矩阵
    int[] laplacian = new int[] { -1, -1, -1, -1, 9, -1, -1, -1, -1 };
    float delta = 0.3; 
    E.r = A.r * laplacian[0] * delta + B.r * laplacian[1] * delta + C.r * laplacian[2] * delta + D.r * laplacian[3] * delta + E.r * laplacian[4] * delta + F.r * laplacian[5] * delta + G.r * laplacian[6] * delta + H.r * laplacian[7] * delta + I.r * laplacian[8] * delta;
    // E.g和E.b值类似

    下面看效果图:

    原图:

    处理后:

    貌似处理有点问题,中间会看到很多的竖线,很明显,可能是没有优化好,因为采用了getPiexels() 和setPixels()方法,所以一维数组的对应图片的宽高有点麻烦。

    下面贴代码,仅供参数,同样注意图片的大小,数组大小不能超过虚拟机规定值。

    /**
         * 图片锐化(拉普拉斯变换)
         * @param bmp
         * @return
         */
        private Bitmap sharpenImageAmeliorate(Bitmap bmp)
        {
            long start = System.currentTimeMillis();
            // 拉普拉斯矩阵
            int[] laplacian = new int[] { -1, -1, -1, -1, 9, -1, -1, -1, -1 };
            
            int width = bmp.getWidth();
            int height = bmp.getHeight();
            Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
            
            int pixR = 0;
            int pixG = 0;
            int pixB = 0;
            
            int pixColor = 0;
            
            int newR = 0;
            int newG = 0;
            int newB = 0;
            
            int idx = 0;
            float alpha = 0.3F;
            int[] pixels = new int[width * height];
            bmp.getPixels(pixels, 0, width, 0, 0, width, height);
            for (int i = 1, length = height - 1; i < length; i++)
            {
                for (int k = 1, len = width - 1; k < len; k++)
                {
                    idx = 0;
                    for (int m = -1; m <= 1; m++)
                    {
                        for (int n = -1; n <= 1; n++)
                        {
                            pixColor = pixels[(i + n) * width + k + m];
                            pixR = Color.red(pixColor);
                            pixG = Color.green(pixColor);
                            pixB = Color.blue(pixColor);
                            
                            newR = newR + (int) (pixR * laplacian[idx] * alpha);
                            newG = newG + (int) (pixG * laplacian[idx] * alpha);
                            newB = newB + (int) (pixB * laplacian[idx] * alpha);
                            idx++;
                        }
                    }
                    
                    newR = Math.min(255, Math.max(0, newR));
                    newG = Math.min(255, Math.max(0, newG));
                    newB = Math.min(255, Math.max(0, newB));
                    
                    pixels[i * width + k] = Color.argb(255, newR, newG, newB);
                    newR = 0;
                    newG = 0;
                    newB = 0;
                }
            }
            
            bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
            long end = System.currentTimeMillis();
            Log.d("may", "used time="+(end - start));
            return bitmap;
        }
  • 相关阅读:
    Kafka 入门(四)-- Python Kafka Client 性能测试
    XShell连接阿里云服务器出现”用户密钥加载失败:请确定输入的密码“处理办法
    优化自动化测试流程,使用 flask 开发一个 toy jenkins工具
    我做了回视频,告诉你需要用到哪些工具
    提问的基本原则
    12 月31 日返利系统问题复盘
    外部prometheus监控k8s(k3s)集群
    一个Java类在运行时候,变量是怎么在JVM中分布的呢?
    JVM学习第二篇思考:一个Java代码是怎么运行起来的-下篇
    JVM学习第一篇思考:一个Java代码是怎么运行起来的-上篇
  • 原文地址:https://www.cnblogs.com/Couch-potato/p/3774503.html
Copyright © 2011-2022 走看看