• 锐化效果


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

    算法原理:

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

    例:

    ABC

    DEF

    GHI

    对E点进行锐化:

    [java] view plaincopy
     
    1. float delta = 0.3; 
    2. E.r = (E.r - (A.r + B.r + C.r + D.r + F.r + G.r + H.r + I.r) / 8) * delta + E.r; 
    [java] view plaincopy
     
    1. float delta = 0.3;  
    2. 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点进行锐化。

    [java] view plaincopy
     
    1. // 拉普拉斯矩阵 
    2. int[] laplacian = new int[] { -1, -1, -1, -1, 9, -1, -1, -1, -1 }; 
    3. float delta = 0.3;  
    4. 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; 
    5. // E.g和E.b值类似 
    [java] view plaincopy
     
    1. // 拉普拉斯矩阵  
    2. int[] laplacian = new int[] { -1, -1, -1, -1, 9, -1, -1, -1, -1 };  
    3. float delta = 0.3;   
    4. 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;  
    5. // E.g和E.b值类似  


    下面看效果图:

    原图:

    处理后:

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

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

    [java] view plaincopy
     
      1. /** 
      2.      * 图片锐化(拉普拉斯变换) 
      3.      * @param bmp 
      4.      * @return 
      5.      */  
      6.     private Bitmap sharpenImageAmeliorate(Bitmap bmp)  
      7.     {  
      8.         long start = System.currentTimeMillis();  
      9.         // 拉普拉斯矩阵  
      10.         int[] laplacian = new int[] { -1, -1, -1, -1, 9, -1, -1, -1, -1 };  
      11.           
      12.         int width = bmp.getWidth();  
      13.         int height = bmp.getHeight();  
      14.         Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);  
      15.           
      16.         int pixR = 0;  
      17.         int pixG = 0;  
      18.         int pixB = 0;  
      19.           
      20.         int pixColor = 0;  
      21.           
      22.         int newR = 0;  
      23.         int newG = 0;  
      24.         int newB = 0;  
      25.           
      26.         int idx = 0;  
      27.         float alpha = 0.3F;  
      28.         int[] pixels = new int[width * height];  
      29.         bmp.getPixels(pixels, 0, width, 0, 0, width, height);  
      30.         for (int i = 1, length = height - 1; i < length; i++)  
      31.         {  
      32.             for (int k = 1, len = width - 1; k < len; k++)  
      33.             {  
      34.                 idx = 0;  
      35.                 for (int m = -1; m <= 1; m++)  
      36.                 {  
      37.                     for (int n = -1; n <= 1; n++)  
      38.                     {  
      39.                         pixColor = pixels[(i + n) * width + k + m];  
      40.                         pixR = Color.red(pixColor);  
      41.                         pixG = Color.green(pixColor);  
      42.                         pixB = Color.blue(pixColor);  
      43.                           
      44.                         newR = newR + (int) (pixR * laplacian[idx] * alpha);  
      45.                         newG = newG + (int) (pixG * laplacian[idx] * alpha);  
      46.                         newB = newB + (int) (pixB * laplacian[idx] * alpha);  
      47.                         idx++;  
      48.                     }  
      49.                 }  
      50.                   
      51.                 newR = Math.min(255, Math.max(0, newR));  
      52.                 newG = Math.min(255, Math.max(0, newG));  
      53.                 newB = Math.min(255, Math.max(0, newB));  
      54.                   
      55.                 pixels[i * width + k] = Color.argb(255, newR, newG, newB);  
      56.                 newR = 0;  
      57.                 newG = 0;  
      58.                 newB = 0;  
      59.             }  
      60.         }  
      61.           
      62.         bitmap.setPixels(pixels, 0, width, 0, 0, width, height);  
      63.         long end = System.currentTimeMillis();  
      64.         Log.d("may", "used time="+(end - start));  
      65.         return bitmap;  
      66.     }  
  • 相关阅读:
    Allegro PCB转换成PADS方法
    Altium Designer只显示某一层,隐藏其他层
    DCDC功率电感(Inductor)选型
    DDR布线教程
    DDR地址、容量计算、Bank理解
    DDR3中的ODT(On-die termination)
    LINUX文件系统操作指令之四
    linux系统之间通过nfs网络文件系统挂载设置方法
    linux消息队列编程实例
    system()函数
  • 原文地址:https://www.cnblogs.com/clarence/p/3837830.html
Copyright © 2020-2023  润新知